Git Workflow学习(三)
前文介绍了功能分支工作流,下面继续介绍Gitflow工作流,原文链接见文末。
Gitflow 是一种典型的 Git 工作流,最初提出时被认为是管理 Git 分支的颠覆性新颖策略。现在基于Gitflow工作流越来越流行,被认为是现代持续软件开发和DevOps实践的最佳实践。Gitflow与CI/CD一起使用也可能具有挑战性。这篇文章详细介绍了 Gitflow。
什么是 Gitflow?
Gitflow 是一种替代的 Git 分支模型,涉及使用功能分支和多个主分支。它最初由"Vincent Driessen at nvie"发布并流行起来。与基于主干的开发相比,Gitflow 具有大量、寿命更长的分支和更大的提交。在此模型下,开发人员创建一个功能分支,并延迟将其合并到主干分支,直到功能完成。这些长期存在的功能分支需要更多的协作才能合并,并且偏离主干分支的风险更高。它们还可能引入冲突的更新。
Gitflow 可用于具有计划发布周期的项目和持续交付的DevOps最佳实践。此工作流不会添加任何超出功能分支工作流所需的新概念或命令。相反,它将非常具体的角色分配给不同的分支,并定义它们应该如何以及何时进行交互。除了featrue分支之外,它还使用单独的分支来准备、维护和记录版本。当然,您还可以利用 Feature Branch 工作流的所有优势:拉取请求、隔离实验和更高效的协作。
工作方式
Develop和main分支
此工作流使用两个分支来记录项目的历史记录,而不是单个main
分支。main
分支存储官方版本记录 ,develop
分支充当功能的集成分支。使用版本号标记(tag)main
分支中的所有提交也很方便。
第一步是用develop
分支补充缺省main
分支。一个简单的方法是让一个开发人员在本地创建一个空develop
分支并将其推送到服务器:
git branch develop
git push -u origin develop
此分支将包含项目的完整历史记录,而main
将包含精简版本。其他开发人员现在应该克隆中央存储库并创建一个develop
跟踪分支。
使用 git-flow 扩展库时,在现有存储库上执行git flow init
将创建develop
分支:
$ 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
功能分支
步骤 1:创建存储库
每个新功能都应驻留在自己的分支中,这些分支可以推送到中央存储库进行备份/协作。但是,feature分支不从main
分支分出,而是用develop
作为父分支。当一个功能完成时,它会合并回develop
分支中。功能不应直接与main
分支交互。
请注意,就所有意图和目的而言,feature
分支与develop
分支相结合是功能分支工作流。但是,Gitflow 工作流程并不止于此。
Feature
分支通常创建到最新的develop
分支。
创建功能分支
没有 git-flow 扩展的情况:
git checkout develop
git checkout -b feature_branch #基于develop分支创建功能分支
使用 git-flow 扩展时:
git flow feature start feature_branch
继续你的工作,像往常一样使用 Git。
完成功能分支
完成该功能的开发工作后,下一步是将feature_branch
合并到develop
。
没有 git-flow 扩展的情况:
git checkout develop # 切换回develop分支
git merge feature_branch
使用 git-flow 扩展:
git flow feature finish feature_branch
发布分支
一旦develop
获得了足够的功能来发布(或者预定的发布日期即将到来),您就可以从develop
中分叉出一个release
分支。创建此分支将启动下一个发布周期,因此在此之后不能添加任何新功能-只有bug 修复、文档生成和其他面向发布的任务应进入此分支。一旦准备好发布,realease
分支就会合并到main
中并标记版本号。此外,它应该合并回develop
,该分支自发布启动以来可能有进展。
使用专用分支来准备版本,使一个团队可以完善当前版本,而另一个团队可以继续为下一个版本开发功能。它还创建了定义明确的开发阶段(例如,很容易说,“本周我们正在为 4.0 版本做准备”,并在存储库的结构中实际看到它)。
制作release
分支是另一个简单的分支操作。与feature
分支一样,release
分支基于develop
分支。可以使用以下方法创建新release
分支。
没有 git-flow 扩展的情况:
git checkout develop
git checkout -b release/0.1.0
使用 git-flow 扩展时:
$ git flow release start 0.1.0
Switched to a new branch 'release/0.1.0'
一旦版本准备好发布,它将被合并到main
和develop
中,然后release
分支将被删除。合并回develop
很重要,因为关键更新可能已添加到release
分支中,并且它们需要可供新功能访问。如果您的组织强调代码审查,这将是拉取请求的理想场所。
若要完成release
分支,请使用以下方法:
没有 git-flow 扩展的情况:
git checkout main
git merge release/0.1.0
或者使用 git-flow 扩展:
git flow release finish '0.1.0'
Hotfix分支
维护或hotfix
分支用于快速修补生产版本。 hotfix
分支很像release
分支和feature
分支,只是它们基于main
而不是develop
分支 。这是唯一一个应该直接从main
中分叉出来的分支。修复完成后,应将其合并到main
和develop
两分支(或当前分支release
)中,并应使用更新的版本号进行标记。
拥有专门的 bug 修复开发线,可以让您的团队解决问题,而无需中断工作流程的其余部分或等待下一个发布周期。您可以将维护分支视为直接与main
一起工作的临时release
分支。可以使用以下方法创建hotfix
分支:
没有 git-flow 扩展的情况:
git checkout main
git checkout -b hotfix_branch
使用 git-flow 扩展时:
$ git flow hotfix start hotfix_branch
与完成release
分支类似,hotfix
分支被合并到main
和develop
。
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
示例
演示功能分支流的完整示例如下。假设我们有一个main
分支的存储库。
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
除了feature
和release
流之外,hotfix
示例如下:
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 的一些关键要点是:
- 该工作流非常适合基于版本发布的软件工作流。
- Gitflow 为生产环境的修补程序提供了一个专用通道。
Gitflow 的整体流程为:
develop
分支是从main
创建的release
分支是从develop
创建的feature
分支是从develop
创建的- 当一个
feature
完成时,它将合并到develop
分支 - 当
release
分支完成后,它被合并到develop
和main
- 如果
main
检测到问题,则从main
创建hotfix
分支 - 一旦
hotfix
完成,它就会合并到develop
和main
。
资料来源

