Simple Gitflow
业务越来越复杂,分支也越来越多,为提高效率和规避流程错误,商定一个统一的工作流程是至关重要的。
先上图~
分支
Master
它是一个长期分支,存在于整个项目周期。
master
分支上不允许任何代码提交,只能由负责人进行分支合并。该分支存放的应该是随时可供在生产环境中部署的代码。
Feature
-
临时分支,用于开发新功能,不同业务可创建多个
feature
分支。 - 从
master
分支创建,开发测试完成,合并至release
分支后删除。
Release
- 临时分支,用于预发布或回归测试。
- 从
master
分支创建,发布后打tag合并至master后删除。 - 命名建议:release/1.x.x
Hotfix
- 临时分支,用于修复线上问题。
- 从
master
分支创建,发布后打tag合并至master后删除。 - 命名建议:hotfix/bugName
为什么没有develop分支?
develop
分支的职责已经分配到了feature
和hotfix
分支,这样临时分支的修改也不用同步到两个分支(develop和master),为避免混淆,所以移除了develop
分支。
场景1:多个feature并行开发
假设5月收到需求,我们要做群密聊,计划6月上线,并且在群密聊上线前,有个0528优化版本要上。
好了,场景有了,来看看具体流程怎么操作。
- 创建feature分支
从master
分支分别创建feature/groupSChat、feature/me0528,命名最好贴合业务。
git checkout master
git branch feature/groupSChat
git branch feature/me0528
分支建好后,就进入开发和测试阶段;在经历N次提交和测试后准备上线。
- 创建release分支
假设5月份版本是5.5.5 ,从master
分支创建release/5.5.5分支,然后合并feature/me0528分支。
// 从master分支创建release/5.5.5分支并切换到该分支
git checkout master
git checkout -b release/5.5.5
git merge feature/me0528
git branch -d feature/me0528
- 打包上线-5.5.5版本
在release/5.5.5
分支进行最终测试后上线,我们打上tag并合并到master,然后删除release/5.5.5分支。
git checkout master
git merge release/5.5.5
git tag v5.5.5
git branch -d release/5.5.5
注意,到现在虽然5.5.5版本上线了,隔壁分支feature/groupSChat
还在紧张开发中,但它丝毫没有受到影响。
- 群密聊feature,在经过N次提交和测试后,准备上线
假设群密聊版本是6.0.0,从master
分支创建release/6.0.0分支,然后合并feature/groupSChat分支。
git checkout master
git checkout -b release/6.0.0
git merge feature/groupSChat
git branch -d feature/groupSChat
- 打包上线-6.0.0版本
在release/6.0.0
分支进行最终测试后上线,我们打上tag并合并到master,然后删除release/6.0.0分支。
git checkout master
git merge release/6.0.0
git tag v6.0.0
git branch -d release/6.0.0
到这里,我们并行开发的两个feature都上线了;开发过程中我们创建的feature、release等分支,也随发版后删除了,仓库里只是多了两个tag标签。
场景2:紧急修复线上bug
假设在场景1中,刚开始做feature/me0528和feature/groupSChat功能不久,就发现线上版本有严重问题,领导要求马上修复后上线。这时你可能会想,我已经有两个分支在开发了,该咋办呢?别担心,你还有master分支,它存放着可供在生产环境中部署的代码。
- 创建hotfix分支
假设这个严重问题是导致通讯录用不了,contact not work ?
git checkout master
git branch hotfix/contactNotWork
- 打包上线-5.5.1版本
git checkout master
git merge hotfix/contactNotWork
git tag v5.5.1
git branch -d hotfix/contactNotWork
- 首先,这里假设线上版本为5.5.0,bug修复后发版为5.5.1
- 与feature分支不同的是,hotfix分支的代码基于稳定的功能,测试完毕后不需要通过release分支即可发布上线。
小结
- 除了master分支,其它都是临时分支,仓库中只有master分支和正在开发的feature分支,便于维护。
- 临时分支都是从master分支创建的。
- feature分支通过测试后才创建并合并到release分支。
- 通过创建release分支,能有效避免丢失已上线的功能或bug修复代码。
- 场景中分支合并示例使用的
git merge
,当然你也可以用git rebase
,关于二者的区别可参考文末链接。
Thanks
关于本文的由来,首先要感谢 骐彰
同学提供的思路,和现有团队的支持,才促使我整理了这篇文章,感谢。