Gitflow工作流


本文编辑整理自 http://blog.jobbole.com/76867/
一、基本前言  
  Git中的Gitflow工作流主要是通过为功能开发、发布准备和维护分配独立的分支,让发布迭代过程更流畅。严格的分支模型也为大型项目提供了一些非常必要的结构.虽然比功能分支工作流复杂几分,但提供了用于一个健壮的用于管理大型项目的框架。
Gitflow工作流没有用超出功能分支工作流的概念和命令,而是为不同的分支分配一个很明确的角色,并定义分支之间如何和什么时候进行交互。除了使用功能分支,在做准备、维护和记录发布也使用各自的分支。
Git工作流之Gitflow工作流 - hubingforever - 民主与科学
 二、工作方式
Gitflow工作流仍然用中央仓库作为所有开发者的交互中心。和其它的工作流一样,开发者在本地工作并push分支到要中央仓库中。
历史分支主分支&开发分支
相对使用仅有的一个master分支,Gitflow工作流使用2个分支来记录项目的历史。master分支存储了正式发布的历史,而develop分支作为功能的集成分支。这样也方便master分支上的所有提交分配一个版本号。
Git工作流之Gitflow工作流 - hubingforever - 民主与科学
 剩下要说明的问题围绕着这2个分支的区别展开。
功能分支
每个新功能位于一个自己的分支,这样可以push到中央仓库以备份和协作。但功能分支不是从master分支上拉出新分支,而是使用develop分支作为父分支。当新功能完成时,合并回develop分支。新功能提交应该从不直接与master分支交互。
Git工作流之Gitflow工作流 - hubingforever - 民主与科学
 
注意,从各种含义和目的上来看,功能分支加上develop分支就是功能分支工作流的用法。但Gitflow工作流没有在这里止步。
发布分支
Git工作流之Gitflow工作流 - hubingforever - 民主与科学
 
一旦develop分支上需要做一次发布(或者说快到了既定的发布日)的足够功能,就从develop分支上fork一个发布分支。新建的分支用于开始发布循环,所以从这个时间点开始之后新的功能不能再加到这个分支上 —— 这个分支只应该做Bug修复、文档生成和其它面向发布任务。一旦对外发布的工作都完成了,发布分支合并到master分支并分配一个版本号打好Tag。另外,这些从新建发布分支以来的做的修改要合并回develop分支。
使用一个用于发布准备的专门分支,使得一个团队可以在完善当前的发布版本的同时,另一个团队可以继续开发下个版本的功能。
这也打造定义良好的开发阶段(比如,可以很轻松地说,『这周我们要做准备发布版本4.0』,并且在仓库的目录结构中可以实际看到)。
常用的分支约定:
用于新建发布分支的分支: develop
用于合并的分支: master
分支命名: release-* 或 release/*
维护分支
Git工作流之Gitflow工作流 - hubingforever - 民主与科学
 维护分支或说是热修复(hotfix)分支用于生成快速给产品发布版本(production releases)打补丁,这是唯一可以直接从master分支fork出来的分支。修复完成,修改应该马上合并回master分支和develop分支(当前的发布分支),master分支应该用新的版本号打好Tag。
为Bug修复使用专门分支,让团队可以处理掉问题而不用打断其它工作或是等待下一个发布循环。你可以把维护分支想成是一个直接在master分支上处理的临时发布。为什么不直接在发布分支上修复问题, 我的理解是:首先master分支本身就是用于记录历史的,所以应该从master分支切一个分支来做修复,另外这里的 Gitflow工作流,在把发布分支合并到主分支后,发布分支是被删除了的。如果我在为三星手机预装的V1.0的版本上发现一个严重BUG,但是这个BUG所在的功能模块在最新V2.0版本中实际已经不存在,代码也没有。我从V1.0的tag版本迁出 维护分支 后,又如何把这个修改合并到主分支呢?这里 master分支不是真正的 维护分支, 应该称为 定制分支 定制分支 应该是不用删除。这是如果修改代码的 BUG所在的功能模块如果在 master分支 最新V2.0版本中实际已经不存在的话,也就不用合并了。
二、示例
下面的示例演示本工作流如何用于管理单个发布循环。假设你已经创建了一个中央仓库。
创建开发分支
Git工作流之Gitflow工作流 - hubingforever - 民主与科学
 
第一步为master分支配套一个develop分支。简单来做可以本地创建一个空的develop分支,push到服务器上:
<p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px"></p><div><span style="font-family:'Hiragino Sans GB W3','Hiragino Sans GB',Arial,Helvetica,simsun,u5b8bu4f53">git branch develop</span></div><div><span style="font-family:Hiragino Sans GB W3,Hiragino Sans GB,Arial,Helvetica,simsun,u5b8bu4f53"><span class="pln">git push </span><span class="pun" style="color:rgb(102,102,0)">-</span><span class="pln">u origin develop</span></span></div><p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px"></p>
以后这个分支将会包含了项目的全部历史,而master分支将只包含了部分历史。其它开发者这时应该克隆中央仓库,建好develop分支的跟踪分支:
<p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px"></p><div><span style="font-family:'Hiragino Sans GB W3','Hiragino Sans GB',Arial,Helvetica,simsun,u5b8bu4f53"><span class="pln">git clone ssh</span><span class="pun" style="color:rgb(102,102,0)">:</span><span class="com" style="color:rgb(136,0,0)">//user@host/path/to/repo.git</span></span></div><div><span style="font-family:Hiragino Sans GB W3,Hiragino Sans GB,Arial,Helvetica,simsun,u5b8bu4f53"><span class="com" style="color:rgb(136,0,0)">git checkout -b develop origin/develop</span></span></div><p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px"></p>
现在每个开发都有了这些历史分支的本地拷贝。
开发新功能
Git工作流之Gitflow工作流 - hubingforever - 民主与科学
 

这个示例中,小红和小明开始各自的功能开发。他们需要为各自的功能创建相应的分支。新分支不是基于master分支,而是应该基于develop分支:
<p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px"><span class="pln">git checkout </span><span class="pun" style="color:rgb(102,102,0)">-</span><span class="pln">b some</span><span class="pun" style="color:rgb(102,102,0)">-</span><span class="pln">feature develop</span></p>
他们用老套路添加提交到各自功能分支上:编辑、暂存、提交:
<p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px"></p><div><span style="font-family:Hiragino Sans GB W3,Hiragino Sans GB,Arial,Helvetica,simsun,u5b8bu4f53">git status</span></div><div><span style="font-family:Hiragino Sans GB W3,Hiragino Sans GB,Arial,Helvetica,simsun,u5b8bu4f53">git add</span></div><div><span style="font-family:Hiragino Sans GB W3,Hiragino Sans GB,Arial,Helvetica,simsun,u5b8bu4f53">git commit</span></div><p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px"></p>
完成功能开发
Git工作流之Gitflow工作流 - hubingforever - 民主与科学
 
添加了提交后,小红觉得她的功能OK了。她直接合并到她本地的develop分支后push到中央仓库:
<p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px"></p><div><span style="font-family:'Hiragino Sans GB W3','Hiragino Sans GB',Arial,Helvetica,simsun,u5b8bu4f53">git pull origin develop</span></div><div><span style="font-family:Hiragino Sans GB W3,Hiragino Sans GB,Arial,Helvetica,simsun,u5b8bu4f53">git checkout develop</span></div><div><span style="font-family:Hiragino Sans GB W3,Hiragino Sans GB,Arial,Helvetica,simsun,u5b8bu4f53"><span class="pln">git merge some</span><span class="pun" style="color:rgb(102,102,0)">-</span><span class="pln">feature</span></span></div><div><span style="font-family:Hiragino Sans GB W3,Hiragino Sans GB,Arial,Helvetica,simsun,u5b8bu4f53">git push</span></div><div><span style="font-family:Hiragino Sans GB W3,Hiragino Sans GB,Arial,Helvetica,simsun,u5b8bu4f53"><span class="pln">git branch </span><span class="pun" style="color:rgb(102,102,0)">-</span><span class="pln">d some</span><span class="pun" style="color:rgb(102,102,0)">-</span><span class="pln">feature</span></span></div><p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px"></p>
第一条命令在合并功能前确保develop分支是最新的。注意,功能决不应该直接合并到master分支。冲突解决方法和集中式工作流一样。
准备发布
Git工作流之Gitflow工作流 - hubingforever - 民主与科学
 
这个时候小明正在实现他的功能,小红开始准备她的第一个项目正式发布。像功能开发一样,她用一个新的分支来做发布准备。这一步也确定了发布的版本号:
<p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px"><span class="pln">git checkout </span><span class="pun" style="color:rgb(102,102,0)">-</span><span class="pln">b release</span><span class="pun" style="color:rgb(102,102,0)">-</span><span class="lit" style="color:rgb(0,102,102)">0.1</span><span class="pln"> develop</span></p>
这个分支是清理发布、执行所有测试、更新文档和其它为下个发布做准备操作的地方,像是一个专门用于改善发布的功能分支。
只要小红创建这个分支并push到中央仓库,这个发布就是功能冻结的。任何不在develop分支中的新功能都推到下个发布循环中。
完成发布
Git工作流之Gitflow工作流 - hubingforever - 民主与科学
 


一旦准备好了对外发布,小红合并修改到master分支和develop分支上,删除发布分支。合并回develop分支很重要,因为在发布分支中已经提交的更新需要在后面的新功能中也要是可用的。
<p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px"></p><div><span style="font-family:Hiragino Sans GB W3,Hiragino Sans GB,Arial,Helvetica,simsun,u5b8bu4f53">
</span></div><div><span style="font-family:Hiragino Sans GB W3,Hiragino Sans GB,Arial,Helvetica,simsun,u5b8bu4f53">git checkout master</span></div><div><span style="font-family:Hiragino Sans GB W3,Hiragino Sans GB,Arial,Helvetica,simsun,u5b8bu4f53"><span class="pln">git merge release</span><span class="pun" style="color:rgb(102,102,0)">-</span><span class="lit" style="color:rgb(0,102,102)">0.1</span></span></div><div><span style="font-family:Hiragino Sans GB W3,Hiragino Sans GB,Arial,Helvetica,simsun,u5b8bu4f53"><span class="lit" style="color:rgb(0,102,102)">git</span><span class="pln"> push</span></span></div><div><span style="font-family:Hiragino Sans GB W3,Hiragino Sans GB,Arial,Helvetica,simsun,u5b8bu4f53">git checkout develop</span></div><div><span style="font-family:Hiragino Sans GB W3,Hiragino Sans GB,Arial,Helvetica,simsun,u5b8bu4f53"><span class="pln">git merge release</span><span class="pun" style="color:rgb(102,102,0)">-</span><span class="lit" style="color:rgb(0,102,102)">0.1</span></span></div><div><span style="font-family:Hiragino Sans GB W3,Hiragino Sans GB,Arial,Helvetica,simsun,u5b8bu4f53"><span class="lit" style="color:rgb(0,102,102)">git</span><span class="pln"> push</span></span></div><div><span style="font-family:Hiragino Sans GB W3,Hiragino Sans GB,Arial,Helvetica,simsun,u5b8bu4f53"><span class="pln">git branch </span><span class="pun" style="color:rgb(102,102,0)">-</span><span class="pln">d release</span><span class="pun" style="color:rgb(102,102,0)">-</span><span class="lit" style="color:rgb(0,102,102)">0.1</span></span></div><div></div><p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px"></p>
发布分支是作为功能开发(develop分支)和对外发布(master分支)间的缓冲。只要有合并到master分支,就应该打好Tag以方便跟踪。

<p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px"></p><div><span style="font-family:Hiragino Sans GB W3,Hiragino Sans GB,Arial,Helvetica,simsun,u5b8bu4f53"><span class="pln">git tag </span><span class="pun" style="color:rgb(102,102,0)">-</span><span class="pln">a </span><span class="lit" style="color:rgb(0,102,102)">0.1</span><span class="pln"> </span><span class="pun" style="color:rgb(102,102,0)">-</span><span class="pln">m </span><span class="str" style="color:rgb(0,136,0)">"Initial public release"</span><span class="pln"> master</span></span></div><div><span style="font-family:Hiragino Sans GB W3,Hiragino Sans GB,Arial,Helvetica,simsun,u5b8bu4f53"><span class="pln">git push </span><span class="pun" style="color:rgb(102,102,0)">--</span><span class="pln">tags</span></span></div><p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px"></p>
Git有提供各种勾子(hook),即仓库有事件发生时触发执行的脚本。可以配置一个勾子,在你push中央仓库的master分支时,自动构建好对外发布。
用户发现Bug
Git工作流之Gitflow工作流 - hubingforever - 民主与科学
 


对外发布后,小红回去和小明一起做下个发布的新功能开发,直到有最终用户开了一个Ticket抱怨当前版本的一个Bug。为了处理Bug,小红(或小明)从master分支上拉出了一个维护分支,提交修改以解决问题,然后直接合并回master分支:
“`
git checkout -b issue-#001 master

Fix the bug

git checkout master
git merge issue-#001
git push
“`
就像发布分支,维护分支中新加这些重要修改需要包含到develop分支中,所以小红要执行一个合并操作。然后就可以安全地删除这个分支了:
<div><span style="font-family:Hiragino Sans GB W3,Hiragino Sans GB,Arial,Helvetica,simsun,u5b8bu4f53">git checkout develop</span></div><div><span style="font-family:Hiragino Sans GB W3,Hiragino Sans GB,Arial,Helvetica,simsun,u5b8bu4f53"><span class="pln">git merge issue</span><span class="pun" style="color:rgb(102,102,0)">-</span><span class="com" style="color:rgb(136,0,0)">#001</span></span></div><div><span style="font-family:Hiragino Sans GB W3,Hiragino Sans GB,Arial,Helvetica,simsun,u5b8bu4f53"><span class="com" style="color:rgb(136,0,0)">git push</span></span></div><div><span style="font-family:Hiragino Sans GB W3,Hiragino Sans GB,Arial,Helvetica,simsun,u5b8bu4f53"><span class="com" style="color:rgb(136,0,0)">git branch -d issue-#001</span></span></div><p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px"></p>
结束!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值