了解 GitFlow 分支工作流
Gitflow 工作流是一种 Git 工作流设计,由 Vincent Driessen 在 nvie 上首次发布并由此出名。
Gitflow 工作流定义了一种围绕项目发布设计的严格的分支模型。 它提供了一个可靠的框架,用于管理更重要的项目。
Gitflow 非常适合具有计划发布周期的项目。
这种工作流不会超出功能分支工作流所需添加任何新的概念或命令。
它向不同分支分配特定角色,并定义它们应何时且如何进行交互。
另外,对于功能分支,它还使用单独的分支来准备、维护和记录发布情况。
而且你还可以使用功能分支工作流的所有优势:拉取请求、隔离试验和更高效的协作。
此外,对于抽象的 Gitflow 工作流概念,提供了一个更具体的 git-flow 工具集,它与 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 branch develop
git push -u origin develop
此分支将包含项目的完整历史记录,但主分支的历史记录为精简版。 其他开发人员现在应克隆中央存储库,并创建用于开发的跟踪分支。
使用 git-flow 扩展库时,对现有存储库执行 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
功能分支
每个新功能都应位于其分支中,这样可以推送到中央存储库进行备份/协作。
但功能分支使用开发作为它们的父分支,而不是从主分支分出来。
功能完成后,它会合并回开发中。 功能不应直接与主分支交互。

与开发分支组合的功能分支是功能分支工作流。 但 Gitflow 工作流不会停止。
创建功能分支,分支到最新的开发分支中。
不使用 git-flow 扩展创建功能分支:
git checkout develop
git checkout -b feature_branch
使用 git-flow 扩展时:
git flow feature start feature_branch
继续工作,像平时一样使用 Git。
完成功能的开发工作时就完成了功能分支,下一步是将 feature_branch 合并到开发中。
不使用 git-flow 扩展:
git checkout develop
git merge feature_branch
使用 git-flow 扩展:
git flow feature finish feature_branch
发布分支

一旦开发获得足够的功能来发布(或者预定的发布日期即将到来),你可从开发中分叉一个发布分支。
创建此分支将启动下一个发布周期,因此在此之后无法添加任何新功能 – 只有 bug 修复、文档生成和其他面向发布的任务应添加进此分支。
准备好发布后,发布分支将合并到主分支中,并使用版本号标记。
此外,它应合并回开发,开发可能从发布开始就一直在进行。
使用专用分支准备发布,从而使一个团队完善当前发布,而另一个团队继续为下一发布处理功能。
它还创建定义明确的开发阶段。 例如,可以轻易地说“这周我们要为版本 4.0 做准备”,并在存储库结构中查看它。
发布分支的创建是另一个简单的分支操作。 与功能分支一样,发布分支也基于开发分支。
可使用以下方法创建一个新的发布分支。
不使用 git-flow 扩展:
git checkout develop
git checkout -b release/0.1.0
``` cmd
When using the git-flow extensions:
``` cmd
$ git flow release start 0.1.0
Switched to a new branch 'release/0.1.0'
发布准备就绪后,它将合并到主分支和开发分支中。 然后,将删除发布分支。
合并回开发分支至关重要,因为关键更新可能已添加到发布分支。 此外,它们还需可供新功能访问。
如果你的组织要求进行代码评审,这将是用于拉取请求的理想位置。
若要完成发布分支,请使用以下方法:
不使用 git-flow 扩展:
git checkout develop
git merge release/0.1.0
或使用 git-flow 扩展:
git checkout main
git checkout merge release/0.1.0
git flow release finish '0.1.0'

维护或“修补程序”分支用于快速修补生产发布。 修补程序分支与发布分支和功能分支类似,只不过它们基于主分支而非开发分支。
它是唯一应直接从主分支分叉的分支。
修复完成后,它应合并到主分支和开发分支中。 或是最新的发布分支。
此外,主分支应该用更新的版本号进行标记。
使用一个专用于 bug 修复的开发行,可让你的团队无需中断工作流的其余部分即可解决问题。 或者等待下一个发布周期。
可将维护分支视为直接与主分支一起工作的临时发布分支。 可使用以下方法创建修补程序分支:
不使用 git-flow 扩展:
git checkout main
git checkout -b hotfix_branch
使用 git-flow 扩展时:
$ git flow hotfix start hotfix_branch
与发布分支的完成一样,修补程序分支将合并到主分支和开发分支中。
git checkout main
git merge hotfix_branch
git checkout develop
git merge hotfix_branch
git branch -D hotfix_branch
$ git flow hotfix finish hotfix_branch
了解 Gitflow 的一些关键要点包括:
- 工作流非常适用于基于发布的软件工作流。
- Gitflow 为将修补程序推送到生产提供专用通道。
Gitflow 的总体流是:
- 从主分支创建开发分支。
- 从开发分支创建发布分支。
- 从开发分支创建功能分支。
- 功能完成后,它将合并到开发分支中。
- 发布分支完成后,会合并到开发分支和主分支中。
- 如果检测到主分支中存在问题,则从主分支创建一个修补程序分支。
- 修补程序完成后,会合并到开发分支和主分支中。
