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。