工作流的设计是日常开发工作中必须考虑的问题,关乎团队的协作模式,所谓「流」就是保证项目平稳、顺畅地向前迭代,本文介绍三种主要的 Git workflow
Git flow
出现最早,应用最广的一种工作流程,基于”版本发布”的工作流
- 项目存在两个长期分支:主分支
master
、开发分支develop
;三种短期分支:功能分支feature
、补丁分支hotfix
、预发分支release
master
用于存放对外发布的版本,任何时候在这个分支拿到的,都是稳定的分布版develop
用于日常开发,存放最新的开发版release
分支源于develop
分支,用于发布之前(即合并到master
之前)的预发布测试,结束以后必须合入develop
和master
分支- 一旦完成开发,三个短期分支就会被合并进
develop
或master
,然后被删除 - 优点:清晰可控
- 缺点:相对复杂,需要同时维护两个长期分支。对于有”持续发布”需求的项目,代码一有变动就需要部署一次,
develop
需要频繁地合入master
,导致这两者的差别不大,没必要维护两个长期分支
Github flow
Github flow
是Git flow
的简化版,专门配合”持续发布”。它是Github.com
使用的工作流程
- 它只有一个长期分支,就是
master
,使用流程如下: - 第一步:根据需求,从
master
拉出新分支,不区分功能分支或补丁分支 - 第二步:新分支开发完成后,或者需要讨论的时候,就向
master
发起一个pull request
(简称PR
) - 第三步:
Pull Request
既是一个通知,让别人注意到你的请求,又是一种对话机制,大家一起评审和讨论你的代码。对话过程中,你还可以不断提交代码 - 第四步:你的
Pull Request
被接受,合并进master
,重新部署后,原来你拉出来的那个分支就被删除。(先部署再合并也可) - 优点:简单,对于”持续发布”的产品是最合适的流程
- 缺点:假设了合入到
master
就能立刻发布,没有考虑发布窗口,往往需要另外新建一个production
分支跟踪线上版本
Gitlab flow
Gitlab flow
是Git flow
与Github flow
的综合。它吸取了两者的优点,既有适应不同开发环境的弹性,又有单一主分支的简单和便利
- 最大原则叫做”上游优先”(
upsteam first
),即只存在一个主分支master
,它是所有其他分支的”上游”。只有上游分支采纳的代码变化,才能应用到其他分支 - 对于”持续发布”的项目,它建议在
master
分支以外,再建立不同的环境分支。比如,”开发环境”的分支是master
,”预发环境”的分支是pre-production
,”生产环境”的分支是production
- 开发分支是预发分支的”上游”,预发分支又是生产分支的”上游”。代码的变化,必须由”上游”向”下游”发展
- 对于”版本发布”的项目,建议的做法是每一个稳定版本,都要从
master
分支拉出一个分支,比如2-3-stable
、2-4-stable
等等
关于 rebase 和 merge
rebase
的含义是改变当前分支branch out
的位置,merge
负责功能分支合并到主分支
git rebase
其实可以把它理解成是「重新设置基线」,将当前分支重新设置开始点,这样才能知道当前分支和需要比较的分支之间的差异rebase
并没有进行合并操作,只是提取了当前分支的修改,将其复制在了目标分支的最新提交后面- 只对尚未推送的本地修改执行
rebase
操作清理历史,从不对已推送至别处的提交执行rebase
操作,即不要在公共分支使用rebase