Git Flow 使用经验总结
Git Flow 工作流目标
- 规范分支的使用;
- 处理线上版本修复和新版本开发并行的情况;
- 降低开发过程中各成员的处理冲突及合并的成本;(本文针对的目标)
Git Flow 分支简介
master 分支
- master分支存放的是随时可供在生产环境中部署的稳定版本代码
- master分支保存官方发布版本历史,release tag标识不同的发布版本
- 一个项目只能有一个master分支
- 仅在发布新的可供部署的代码时才更新master分支上的代码
- 每次更新master,都需对master添加指定格式的tag,用于发布或回滚
- master分支是保护分支,不可直接push到远程仓master分支
- master分支代码只能被release分支或hotfix分支合并
develop 分支
- develop分支是保存当前最新开发成果的分支
- 一个项目只能有一个develop分支
- develop分支衍生出各个feature分支
- develop分支是保护分支,不可直接push到远程仓库develop分支
- develop分支不能与master分支直接交互
feature 分支
- 命名规则:feature/*
- develop分支的功能分支
- feature分支使用develop分支作为它们的父类分支
- 以功能为单位从develop拉一个feature分支
- 每个feature分支颗粒要尽量小,以利于快速迭代和避免冲突
- 当其中一个feature分支完成后,它会合并回develop分支
- 当一个功能因为各种原因不开发了或者放弃了,这个分支直接废弃,不影响develop分支
- feature分支代码可以保存在开发者自己的代码库中而不强制提交到主代码库里
- feature分支只与develop分支交互,不能与master分支直接交互 如有几个同事同时开发,需要分割成几个小功能,每个人都需要从develop中拉出一个feature分支,但是每个feature颗粒要尽量小,因为它需要我们能尽早merge回develop分支,否则冲突解决起来就没完没了。同时,当一个功能因为各种原因不开发了或者放弃了,这个分支直接废弃,不影响develop分支。
release 分支
- 命名规则:release/,“”以本次发布的版本号为标识
- release分支主要用来为发布新版的测试、修复做准备
- 当需要为发布新版做准备时,从develop衍生出一个release分支
- release分支可以从develop分支上指定commit派生出
- release分支测试通过后,合并到master分支并且给master标记一个版本号
- release分支一旦建立就将独立,不可再从其他分支pull代码
- 必须合并回develop分支和master分支
hotfix 分支
- 命名规则:hotfix/*
- hotfix分支用来快速给已发布产品修复bug或微调功能
- 只能从master分支指定tag版本衍生出来
- 一旦完成修复bug,必须合并回master分支和develop分支
- master被合并后,应该被标记一个新的版本号
- hotfix分支一旦建立就将独立,不可再从其他分支pull代码
SourceTree 工具功能简介
- 将当前仓库自动初始化 git-flow 规范的结构;
- 使用git-flow工作流“下一步”菜单进行工作流节点的创建及完结。
团队协作流程
举例说明
feature
分支在开发团队中如何更好的工作
需求
- 项目当前线上版本 v1.0,待修复bug:样式调整;
- 项目计划下一个版本 v2.0,功能需求:注册登录、支付;
- 项目需要并行任务:修复线上bug,开发新版本功能。
协作思路
为减少分支间合并代码时的差异,可以通过创建一个专门用来合并用的feature分支,比如ft-merge
。其他成员按照自己划分的功能模块,建立对应的feature分支,根据比如ft-login
(注册登录相关功能,开发者张三)、ft-pay
(支付相关功能,开发者李四、王五)。约定每天的同步代码任务:张三负责ft-login
分支的更新,先从ft-merge
pull代码到ft-login
,解决冲突后merge回ft-merge
。李四负责ft-pay
,先让王五提交代码到ft-pay
,然后从ft-merge
pull代码到ft-pay
,解决冲突后,然后merge回ft-merge
。
项目成员及分工
成员 | 职责 | 开发分支 |
---|---|---|
刘备 | 组长,git 分支管理 | feature/ft-v20-merge,feature/hotfix-* |
关羽 | 模块责任人,登录注册 | feature/ft-login |
赵云 | 模块责任人,支付模块(支付宝渠道)开发,当前分支代码同步 | feature/ft-pay |
张飞 | 支付模块(微信渠道)开发 | feature/ft-pay |
魏延 | 支付模块(银联渠道)开发 | feature/ft-pay |
黄忠 | 支付模块(支付网关)开发 | feature/ft-pay |
协作流程
刘备
初始化feature分支:- feature/ft-v20-merge
- feature/ft-login
- feature/ft-pay
- 开发者
关羽
、张飞
、赵云
检出自己负责的分支; -
关羽
每天上班时 pullft-v20-merge
分支,下班时 merge 到ft-v20-merge
; -
张飞
、魏延
、黄忠
每天上班时 pullft-pay
分支,下班时 push (这里是 push) 到ft-pay
; -
赵云
每天上班时 pullft-v20-merge
分支,下班时 merge 到ft-v20-merge
; -
刘备
每天上班时 检查ft-v20-merge
分支分合并记录,同时review代码; -
刘备
接到线上v1.0 的bug报告,需要修复一个样式问题, 通过SourceTree git-flow 工作流工具“新建修复补丁”,自动从master
检出修复分支hotfix/hf-style
,进行代码修改,测试通过后完成 “修复补丁”生命周期,hf-style
分支被合并回develop
分支,并将develop
分支合并到ft-v20-merge
; -
关羽
和赵云
第二天上班时,同步代码,将刘备
提交的bug修复内容合并到自己的 feature 分支。 - 当
v2.0
版本提测前,刘备
确认各开发者代码全部提交,在ft-v20-merge
构建提测版本。所有成员跟踪及修复测试bug,完成测试阶段。 -
刘备
通过 SourceTree git-flow 选项“完成功能”,将自动合并ft-v20-merge
到develop
。 -
刘备
通过 SourceTree git-flow 选项“新建版本”,将自动从develop
检出release/r-v2.0
(名称自己定义),对版本号等信息等作一些微调后,通过 SourceTree git-flow 选项“完成版本”,自动合并当前分支至master
。
流程回放
刘备
作为开发组长,可以每天检查代码提交情况。关羽
、赵云
作为功能模块负责人,对合并给到刘备
的ft-v20-merge
代码负责。张飞
、魏延
、黄忠
作为开发者,不用去关注自己分支和develop
分支差异,只需关注每天pull时可能发生的冲突。刘备
作为开发组长,负责线上BUG的修复,合并 hotfix 到 master ,发布修复版本,并将修复代码‘同步’给开发成员。
该流程的特点
- 减少 feature 分支与 develop 分支交互的频次,从而降低冲突发生次数,普通开发者只需关注知己负责的分支;
- 从各个
feature-xxx
分支直接merge回develop
分支改为只由feature-v20-merge
merge 回develop
分支,develop
合并的质量可以更好地控制。 - 理论上可以很好的支持跨团队协作的项目,例如增加
曹操
负责的开发队伍加入,只需增加ft-v20-merge-cc
(cc表示组长或负责人),操作执行刘备
相同的日常操作,等到发布版本前决定刘备
主导合并。