Gitflow工作流

前言
最近换了一个新公司,因为之前做过几年的开发,也有过一定的管理经验,所以公司很器重,也希望自己能改善公司iOS团队的现状。
既然有这样的机会,自己当然要好好把握了。这也许是自己面向真正管理的第一步吧。
因为公司团队比较年轻,为了以后可以更好的管理团队,首先制定了代码规范。后来,发现公司代码管理也不是很好,于是就参考市面代码管理方案,写了下面的总结。
背景
目前市面管理代码的工具主要有SVN和Git两种,而Git以分布式管理最终受到广大程序员的喜爱。
主流的Git工作流有3种:
1. 集中式工作流,类似传统的SVN,没有很好的发挥Git的功效;
2. 功能分支工作流,在master分支上创建功能分支,在功能分支上开发新需求,开发完毕后,合并到master分支;这种工作流方式适合小团队的开发,如果是大的团队,这种方式会有一些小麻烦,于是有了下一个工作流;
3. Gitflow工作流,本文也主要介绍此工作流;
下面是一张Gitflow工作流的示意图:

工作方式
Gitflow工作流主要有两个分支,master和develop分支,所有的操作都围绕着两个分支来做的,这两个分支代表了研发过程中的两个重要环节:发版和开发。master是一个随时可以发版的分支,而develop是一个随时可以开发新功能的分支。接下来,配合SourceTree工具详细说明一下Gitflow在不同的阶段是如何工作的。
初始化
首先将远程代码仓库clone到本地,打开SourceTree,在右上角有一个Git Flow的按钮,单击后如图:

建议不做任何修改,直接OK。SourceTree会自动化进行一些操作,最明显的变化是多了一个develop分支。

将新建的develop分支推送到远端仓库。从此,代码库里就存在了两个永久性的分支:master和develop,未来所有的开发工作都围绕这两个分支进行派生跟合并。这两个分支也被称为“历史性”分支。

新功能开发:创建feature分支,合并feature分支
当进入开发阶段,需要开发新功能时,需要先创建一个新的分支,注意,这个分支使用develop分支作为父分支,当新功能完成后合并到develop分支,新功能提交不应该直接与master分支交互。

使用SourceTree可以很方便完成这一过程,初始化结束后,再次单击GitFlow按钮,如图,选择New Feature,然后输入分支名称。


当新功能开发完成后,需要合并分支到develop分支,这时单击GitFlow按钮,选择Finish Current按钮,使用默认设置,单击OK。


提测阶段:创建release分支,合并release分支
当开发进入到测试阶段时,需要给测试人员提供测试包,此时需要在develop创建release分支,测试阶段出现的bug,在release分支上进行修改,测试通过后,将release分支合并到develop和master分支。

使用SourceTree实现这一过程,继续单击GitFlow按钮,如图,选择New Release,然后输入分支名,单击OK。


测试结束后,合并release分支,继续单击GitFlow按钮,选择Finish Current按钮,使用默认设置,然后输入Tag名,单击OK。


确认没有冲突后,将本地推送到远程仓库。
线上维护:创建hotfix分支,合并hotfix分支
当产品通过测试后,就会发版上线。可能会遇到一个紧急问题需要解决。这时需要创建hotfix分支了,需要注意,hotfix分支是唯一从master分支fork出来的分支。修复完后,需要立即合并到master分支和develop分支,master分支应该用新的版本号打好tag。

使用SourceTree完成这一过程步骤,继续单击GitFlow按钮,如图,选择New Hotfix按钮,输入分支名称。


修改,测试,都需要在这个分支上完成。当测试通过后,合并分支,继续单击GitFlow按钮,如图,选择Finish Current按钮,输入tag名称,选择OK。


确定没有冲突后,将修改推送到远端仓库。
Git网络图如下:

至此一个完整的开发周期结束,当然上面仅仅模拟了一个简单开发周期,真正的开发一定会比较复杂,但只要按照这个流程管理代码,再复杂的开发情况,也不会出现问题。
唯一需要注意的时候,在合并代码时会出现冲突,一定要先解决冲突后再推送到远端仓库。
唯一需要注意的时候,在合并代码时会出现冲突,一定要先解决冲突后再推送到远端仓库。
唯一需要注意的时候,在合并代码时会出现冲突,一定要先解决冲突后再推送到远端仓库。
重要的事情说三遍。
如果你是喜欢终端开发的,Gitflow也提供了相应的工具。无论是GUI还是终端,Gitflow提供的是一套完善的代码管理流程,只要理解了这个流程,使用什么都可以飞。
参考:
Git版本控制与工作流
Git工作流指南:Gitflow工作流
end