1. 概要
master分支(DevOps Permission)
- 常驻分支也是稳定分支,是生产环境中最新代码
- 由于灰度环境是模拟的生成环境,部署的也是master分支
- 发布完成后,对每个版本进行tag
- 不允许直接提交代码,只接受merge request
develop分支(Tech Lead Permission)
- 常驻分支,是开发环境中最新代码
- 不允许直接提交代码,只接受merge request
- 该分支仅能merge当前版本要发布的feature及bug fixed
release分支(Test Team Focus)
- 临时分支,也称测试分支,命名规则依赖于发布的版本号
- release分支包含的内容为本次待发布的功能需求、改进优化或bug fixed
- 生命周期从提测开始,bug修复到该版本发布之前为止
- QA验证完毕,将该版本的release分支merge到master分支和develop分支
- 测试阶段的bug fixed可在该release分支进行操作,不需要再切分支了
- 该分支为待发布的封版代码,只允许bug fixed,不能提交无关代码,如代码优化等,如需必要优化及变更,请和产品测试达成一致。
feature分支(Dev Team Focus)
- 功能分支也是临时分支,该分支需要关联到具体的JIRA号
- 该功能分支当且仅当是一个feature的开发或一个bug fixed
- 生命周期最短,颗粒度也比较小
2. 功能分支
checkout规则
从develop分支checkout待开发的功能分支,每个功能分支,需要关联到JIRA面板的一个任务即JIRA号,如上图所示,面板中BKWALLET-434,则对应分支为feat-434。
注意:
- 由于每个功能分支依赖于具体的JIRA中的任务,需要将JIRA中任务进行拆分,拆分的粒度要需要Tech lead来操作,保证子任务在开发阶段的可执行性
- 目前Feature分支的代码提交,会强制触发填写对应的JIRA号
merge request规则
将开发完毕的分支,拉取develop最新代码,merge并解决冲突后,之后在对应的feature分支创建并提交到develop分支,并自动触发merge request请求,由code review group进行代码审查。
注意:
- 代码提交注释包含需求、改动点、JIRA号、注意事项等
- 每个merge request不要包含不相关的功能
- merge request提交后需要及时跟踪动态,包括通过、打回等
- 该功能进入提测流程后,需删除之前的功能分支
3. 维护分支
当线上版本出现问题,需要从master分支checkout出hotfix分支,代码修复完毕,并且QA验证通过后,将该分支merge request到master和develop分支。
其中master分支的merge request需要admin来审批,admin可以是tech leader或devops,由项目组的实际情况来决定。
4. 命名规则
目前公司sprint迭代周期为两周,每个迭代周期内会有多次版本发布,内部版本号以M(milestone)序列开头,比如M5、M6、M7等;每个内部版本周期内也会存在多次小版本的迭代的情况。
Tag标签(Required)
每一次merge到master分支产生的变更,都需要进行tag,相比只用commit号来说,更容易追踪历史版本,有利于后期维护。针对不同项目特性、建议命名如下:
Backend(Java/PHP)/Frontend(Web)
tag命名方式建议方式为<内部版本号/子版本号>,子版本号可以为发布日期或临时版本号等形式,可由各组自行调整,比如M5/v1.1.0、M5/v1.2.0、M5/20181219等。
对于Hotfix的情况,tag标签命名方式,可以根据待修复的版本号+1,比如从tag为M5/v1.2.0,则修复后的tag为M5/v1.2.1。
Android/iOS
业务APP/对接业务SDK(比如钱包收银台SDK)的tag命名与发布版本号保持一致,比如v2.9.0;
业务组件的tag命名方式为内部版本号,可根据实际情况调整。
注意:移动端的版本发布会存在cross多个内部版本情况,因此,不需要指定内部版本号作为前缀形式。
release分支(Optional)
临时分支,命名规则建议与tag方式一致,也可以根据实际情况自行调整。
该分支完成发布后,将该分支删除。
feature分支(Optional)
临时分支,命名规则建议与JIRA号一致,也可以根据实际情况自行调整。
该分支merge到develop分支后或提测之前,将该分支删除。
hotfix分支(Optional)
临时分支,应用范围对于线上出现bug,需要紧急修复的情况,命名规则建议参考tag分支,不强制要求,可以根据情况自行调整。
该分支merge到master分支后,将该分支删除。
5. 常用Git命令
切换分支(分支名)
git checkout develop
创建local分支(分支名为feat-BKWALLET-233)
git checkout -b feat-BKWALLET-233
创建remote分支(分支名为feat-BKWALLET-233)
git push origin feat-BKWALLET-233
拉取remote分支到local(分支名为develop)
git pull origin develop
提交local changes到remote(分支名为develop)
git push origin develop
合并分支(develop分支merge功能分支 feat-BKWALLET-233)
git checkout develop // 切换
git merge feat-BKWALLET-233 // 合并
注意:确保当前分支为要合并分支,比如develop分支
删除remote分支(分支名为feat-BKWALLET-233)
git push origin :feat-BKWALLET-233
删除local分支(分支名为feat-BKWALLET-233)
git branch -D feat-BKWALLET-233
查看全部分支
git branch -a
将remote的新分支或新tag信息同步到local
git fetch --all
创建local tag(创建tag为M5/v1.2.0,同时要增加注释)
当前commit号打tag标签:
- 无注释:git tag -a M5/v1.2.0
- 有注释:git tag -a M5/v1.2.0 -m "M5的v1.2.0版本发布"
补打tag标签(指定commit号为 9fbc3d0):
git tag -a M5/v1.2.0 9fbc3d0
注意:
创建tag标签,根据命名方式可以对应到版本号及发布功能,因此,注释上不做强制,根据实际情况是否追加注释。
创建remote tag
git push origin M5/v1.2.0
从remote tag切换分支(hotfix分支为hotfix-1.2.0)
git fetch --all // sync first
git checkout tags/M5/v1.2.0 -b hotfix-1.2.0