如何选择 Git 分支模式?
阿里妹导读:编写代码,是软件开发交付过程的起点,发布上线,是开发工作完成的终点。代码分支模式贯穿了开发、集成和发布的整个过程,是工程师们最亲切的小伙伴。那如何根据自身的业务特点和团队规模来选择适合的分支模式呢?本文分享几种主流 Git 分支模式的流程及特点,并给出选择建议。
文末福利:下载《阿里巴巴 DevOps 实践手册》电子书。
主干开发,主干发布。
分支开发,主干发布。
主干开发,分支发布。
分支开发,分支发布。
如果一个软件,只有一个开发者,只需要一个发布版本,那他需要什么样的分支模式?
如果一个软件,有 10 位开发者,需要支持多个版本,那他们又需要什么样的分支模式?
有且仅有一个开发分支,即主干分支。
所有改动都发生在主干分支。
发布可以从主干拉发布分支。
主干上进行的修复需要根据缺陷的修复策略,确定是否 cherry pick 到对应版本的发布分支。
每一次的变更要小,这样在验证的过程中才能控制范围。
快速完成验证,这就要求有相对完善的自动化检查验证机制。
feature 分支:开发者进行功能开发的分支。
develop 分支:对开发的功能进行集成的分支。
release 分支:负责版本发布的分支。
hotfix 分支:对线上缺陷进行修改工作的分支。
master:保存最新已发布版本基线的分支。
开发者接到一个开发需求,从 develop 分支拉一个 feature 分支。
大家完成自己本地的开发工作,完成本地验证,提交代码到 feature 分支。
基于 feature 分支进行验证,并持续合并新的开发代码。
完成特性的开发,并且 feature 分支验证无误,将 feature 分支的代码合并到 develop 分支。
在 develop 分支进行集成验证(此处,可能和其他合并进来的特性分支一起进行验证),集成验证完毕,feature 分支会被删除。
当 develop 分支是一个成熟的发布版本时,如完成了彻底的测试及问题的修复,拉出 release 分支进行发布。
完成发布之后,将 release 分支合并入 develop 和 master(master 保存的永远都是已发布的最新代码),并删除 release 分支。
如果发布之后,发现了缺陷,基于 master 拉出一个 hotfix 分支。
在 hotfix 对问题进行修改及验证。
问题的修复合并到 develop 和 master 上。
删除 hotfix 分支。
分支特别多,而且每类分支都有特定限定的用法,开发者很难记住什么分支是干什么的。
整个分支模式过于复杂,大大超出大部分团队和项目的需求。
feature 分支的生命周期过长导致的合并冲突。如果一个特性所在 feature 分支生命周期过长,它跟 develop 分支的差异就越大,这样,在该特性集成到 develop 的过程中,潜在的代码冲突将是集成的噩梦。
像 develop 分支,感觉其实存在的意义不是太大,完全通过 master 就可以替代集成的作用,额外为变更提交的集成引入 develop 分支,对分支模式来说,变得更加的复杂;同样,如果取消 develop 分支,那么,hotfix 分支存在的意义也就没有必要了,因为这个时候,hotfix 分支与 feature 分支就没有任何的差别。
在 master 分支上的所有代码都应该是最新可部署、可工作的版本。
如果要进行新的工作,从 master 分支上拉出一个新的分支,并以工作任务清晰命名,如 “new-scheduling-strategy”。
尽可能频繁地提交代码变更到本地分支,与此同时,尽可能频繁地同步到服务端相同分支名的分支。
当准备合并代码到 master 主干分支上,通过发起 Pull Request,提请代码评审。
通过代码评审后,或与此同时,需要将该分支部署到测试环境,进行验证。
如果评审通过及验证通过,代码则合并到 master 主干分支上,应该立即部署到生产环境。
TBD 应该是主干开发,可以是分支发布,也可以是主干发布。
Git-Flow 应该是分支开发,分支发布。
GitHub-Flow 应该是分支开发,主干发布。
GitLab-Flow 支持分支开发,但支持主干发布,也支持分支发布。
支持一个产品多个发布版本,用 Git-Flow。
支持一个简单产品单个发布版本,用 GitHub-Flow 或 TBD。
支持一个复杂产品单个发布版本,用 GitLab-Flow。
参考
[1]TBD: https://trunkbaseddevelopment.com/ [2]A successful Git branching model: https://nvie.com/posts/a-successful-git-branching-model/ [3]Learn Version Control with Git: https://www.git-tower.com/learn/git/ebook/cn/command-line/advanced-topics/git-flow [4]Branching Models and Best Practices for Abstract - Design Version Control: https://projekt202.com/blog/2018/branching-models-and-abstract [5]Understand the GitHub-Flow: https://guides.github.com/introduction/flow/ [6]GitHub Flow: http://scottchacon.com/2011/08/31/github-flow.html [7]Introduction to GitLabFlow: https://docs.gitlab.com/ee/workflow/gitlab_flow.html