Gitflow工作流

原文链接: https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow

名词解释

Gitflow工作流(Gitflow Workflow)是2010年由Vincent Driessen在他的一篇博客里提出来的。它定义了一整套完善的基于Git分支模型的框架,结合了版本发布的研发流程,适合管理具有固定发布周期的大型项目。

和特性分支工作流相比,Gitflow工作流并没有引入任何新的概念。不同的地方在于,它强化了对Git分支模型的使用,结合产品或项目发布周期的特定需求,定义了各种不同类型的分支,每一种分支都有它自己特定的职责,并且分支之间什么时候、以什么样的方式交互,也都有相应的规则。下面我们就具体来看一下。

Gitflow 实际上只是 Git 工作流程的抽象概念。这意味着它规定了要设置什么样的分支以及如何将它们合并在一起。我们将在下面讨论分支的目的。git-flow 工具集是一个具有安装过程的实际命令行工具。git-flow 的安装过程很简单。git-flow 的软件包可在多个操作系统上使用。在 OSX 系统上,您可以执行brew install git-flow. 在 Windows 上,您需要下载并安装 git-flow。安装 git-flow 后,您可以通过执行git flow init. Git-flow 是一个围绕 Git 的包装器。该git flow init命令是默认git init 命令的扩展,除了为您创建分支外,不会更改存储库中的任何内容。

简单直白一点:git flow 把一些常用分分值合并操作,帮你简化由一条命了完成了。当然这只是表面现象。更重要的是他的工作流程方式。

工作原理/过程

git-flow

开发分支、主要分支 - develop branch, main branch/master branch

这个工作流不是一个main 分支,而是使用两个分支来记录项目的历史。该main 分支存储官方发布历史,该develop分支用作功能的集成分支。main 使用版本号标记分支中的所有提交也很方便。

第一步是main 用一个develop分支来补充默认值。一种简单的方法是让开发人员在develop本地创建一个空分支并将其推送到服务器:

1
2
git branch develop
git push -u origin develop

这个分支将包含项目的完整历史,而main 将包含一个删节版本。其他开发人员现在应该克隆中央存储库并为develop.

使用 git-flow 扩展库时,git flow init在现有 repo 上执行将创建develop分支:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ git flow init

Initialized empty Git repository in ~/project/.git/
No branches exist yet. Base branches must be created now.
Branch name for production releases: [main]
Branch name for "next release" development: [develop]


How to name your supporting branch prefixes?
Feature branches? [feature/]
Release branches? [release/]
Hotfix branches? [hotfix/]
Support branches? [support/]
Version tag prefix? []


$ git branch
* develop
main

功能分支 - feature branch

每个新功能都应该驻留在自己的分支(branch)中,可以将其推送到中央存储库以进行备份/协作。但是,功能分支不是从 main 分支出来,而是把 develop 作为父分支。当一个特性完成时,它会被合并回 develop。功能分支不应该直接与 main 发生交互(例如:合并到main ).

功能分支(feature branch)通常是由最新的 develop 分支创建

feature-branch

创建功能分支 - Creating a feature branch

不使用git flow时,我们这样创建:

1
2
git checkout develop
git checkout -b feature_branch

使用git flow:

1
git flow feature start feature_branch

然后就可以像平时一样继续使用 Git了。

完成功能分支 - Finishing a feature branch

当你的功能开发完成了,需要结束当前分支开发, 下一步就是要将分支合并到 develop 分支

不使用git flow时,我们这样创建:

1
2
git checkout develop
git merge feature_branch

使用git flow:

1
git flow feature finish feature_branch

发布功能分支 Release branches

Release branches

如果 develop 分支有足够多的功能可以发布,或者是计划的发布时间快到了。你可以从 develop 分支 fork(可以理解为 复制)一个 release 分支。创建这个分支之后,就可以开启下一轮的发布周期了。

因此这个分支将不再增加新功能,只有错误修复、文档生成或者其他发布任务。一旦准备就绪可以发布的时候,就可以将 release 分支合并到 main ,打上版本号,然后再合并到 develop 分支上。

不过,我平时工作中,把这一步省略了,直接用 main 代替了 release ,直接把develop 合并到 main 了进行后续操作。(此行非原文内容,作者自己添加)

使用专门的分支来准备发布,可以让一个团队完善当前版本,而另一个团队继续为下一个版本开发功能。它还创建了明确定义的开发阶段(例如,很容易说,“本周我们正在为版本 4.0 做准备”,并在存储库的结构中实际看到它)。

制作release分支是另一种简单的分支操作。与 feature 分支一样,release 分支也是基于 develop 分支的。release 可以使用以下方法创建新分支。

没有 git-flow :

1
2
git checkout develop
git checkout -b release/0.1.0

使用 git-flow :

1
2
$ git flow release start 0.1.0
Switched to a new branch 'release/0.1.0'

一旦发布准备好发布,它将被合并到 main and develop 中,然后 release 分支将被删除。重新合并很重要,develop 因为可能有关键更新被添加到 release 分支中,并且需要新功能可以用到它们。如果您的组织强调代码审查,这将是拉取请求的理想场所。

要完成一个release分支,请使用以下方法:

修复/修补分支 - Hotfix branches

hotfix
这个分支用户快速修复 生产环境的问题(bug),Hotfix分支 类似于 release 分支和 feature分支, 不同的是 Hotfix 是基于 main 创建的分支。这个分支仅能从 main 创建。一旦修复完成之后,需要合并到 main 和 develop 分之上去(或者是当前的 release 分支),并且将 main 打上(标记) 新的版本号。

拥有专门的漏洞修复开发线可以让您的团队解决问题,而无需中断工作流程的其余部分或等待下一个发布周期。您可以将维护分支视为release直接与main. hotfix可以使用以下方法创建分支:

没有 git-flow :

1
2
git checkout main
git checkout -b hotfix_branch

使用 git-flow :

1
$ git flow hotfix start hotfix_branch

类似于完成一个 release 分支,一个 hotfix 分支被同时合并到 maindevelop 分支.

1
2
3
4
5
git checkout main
git merge hotfix_branch
git checkout develop
git merge hotfix_branch
git branch -D hotfix_branch

例子

演示功能分支流程的完整示例如下。假设我们有一个带有 main 分支的 repo 设置。

1
2
3
4
5
6
7
8
9
git checkout main
git checkout -b develop
git checkout -b feature_branch
# work happens on feature branch
git checkout develop
git merge feature_branch
git checkout main
git merge develop
git branch -d feature_branch

除了 featurerelease 流程,一个 hotfix 例子如下:

1
2
3
4
5
6
7
git checkout main
git checkout -b hotfix_branch
# work is done commits are added to the hotfix_branch
git checkout develop
git merge hotfix_branch
git checkout main
git merge hotfix_branch

概括总结

在这里,我们讨论了 Gitflow 工作流。Gitflow 是 您和您的团队可以使用的多种 Git 工作流程之一

了解 Gitflow 的一些关键要点是:

  • 该工作流程非常适合基于发布的软件工作流程。
  • Gitflow 为生产环境的修补程序提供了一个专用通道。

Gitflow的整体流程是:

  1. 一个develop分支是从创建的main
  2. 一个release分支是从创建的develop
  3. Feature 分支是从创建的develop
  4. 当 afeature完成时,它被合并到develop 分支中
  5. 当release分支完成后,它被合并到develop和main
  6. 如果main 检测到问题,hotfix则创建一个分支main
  7. 一旦hotfix完成,它就会合并到两者develop和main

个人见解:git flow 并没有什么深奥的原理,从表面看,仅仅是将多个指令 合并到一条,减少了操作。其实是在多次实践之后总结出来的一套比较适合大多数人的工作流程。

当然,这套流程并不一定适合你,你也可以采取自己的工作方式,在我的平时开发中,大部分是时间一个项目很少有功能在并发开发,只有一个新功能完成之后,才会开始下一个,因此即使使用 release 分支,同是也只有一个, 就把干脆把 release 分支省略了,所有发布都直接合并到了main/mater 分之上去了,其他的还是按照 git flow 的方式。

作者

Fat Dong

发布于

2022-02-26

更新于

2022-02-26

许可协议