团队协做开发中,大部分都会用到版本控制软件,好比Git、Svn等。本文将经过一个实例,详细讲解在真实的工做环境中,一个团队应该如何利用Git+Github进行协做开发,即详解Git工做流程。并就其中比较棘手的问题做出解答,好比如何解决冲突比较合适,如何创建各类类型的分支等。git
本文不会讲解Git简介、Git原理、Git基本用法等,有不了解的能够参考“ Git 参考手册 ”。咱们举例演示的是GitFlow工做流的功能,这里先放一张经典的GitFlow工做流图示:web
其中涉及到的主要分支类型有:测试
develop分支,即开发分支,从master分支上检出。团队成员通常不会直接更改该分支,而是分别从该分支检出本身的feature分支,开发完成后将feature分支上的改动merge回develop分支。同时release分支由此分支检出。spa
release分支,即发布分支,从develop分支上检出。该分支用做发版前的测试,可进行简单的bug修复。若是bug修复比较复杂,可merge回develop分支后由其余分支进行bug修复。此分支测试完成后,须要同时merge到master和develop分支上。3d
feature分支,即功能分支,从develop分支上检出。团队成员中每一个人都维护一个本身的feature分支,并进行开发工做,开发完成后将此分支merge回develop分支。此分支通常用来开发新功能或进行项目维护等。版本控制
fix分支,即补丁分支,由develop分支检出,用做bug修复,bug修复完成需merge回develop分支,并将其删除。因此该分支属于临时性分支。orm
hotfix分支,即热补丁分支。和fix分支的区别在于,该分支由master分支检出,进行线上版本的bug修复,修复完成后merge回master分支,并merge到develop分支上,merge完成后也能够将其删除,也属于临时性分支。blog
下边咱们一步步拆分讲解各类类型分支的用法。ci
(1)假设团队就一我的“xianhu”,作一个叫TestGit的项目,并将其代码托管在Github上。首先须要在Github上新建一个项目TestGit:开发
按照Github上的提示,在本地新建一个项目,并关联到Github上的orgin/master。此时开发一个很小的demo功能,并提交到线上,并在master分支上进行打tag操做,并命名为v0.1。此时的GitFlow工做流为:
(2)若是此时master分支的代码正在线上运行,并且又须要开发新功能,则不能在master分支上直接修改。一个比较好的策略是在master分支上新建并检出develop分支,新功能的开发在develop分支上进行,此时记得将develop分支提交到远端:
git branch develop master # 从master分支上新建develop分支 git checkout develop # 检出develop分支 # 此处可进行功能开发,并add和commit到develop分支 git push origin develop # 推送develop分支到远端的origin/develop
即Github上保持两个分支:master和develop。目的是为之后团队协做更新develop分支作准备。此时Github上为:
此时会出现两种状况:
git checkout master # 切换回master分支 git checkout -b hotfix master # 新建hotfix分支,并切换到该分支 # 作一些bug修复工做 git checkout master # 切换回master分支 git merge --no-ff hotfix # 合并hotfix分支,此时bug已被修复(无冲突) git tag v0.2 # 新建tag v0.2 git push origin master # 推送master分支代码到远端 git push origin --tags # 推送tag到远端
git checkout develop # 切换回develop分支 git checkout -b release01 develop # 新建release分支,并切换到该分支 # 作一些测试、bug修复等工做 git checkout develop # 切换回develop分支 git merge --no-ff release01 # 合并release01分支到develop分支(无冲突) git push origin develop # 推送develop分支到远端 git checkout master # 切换回master分支 git merge --no-ff release01 # 合并release01分支到master分支(无冲突) git tag v0.3 # 新建tag v0.3 git push origin master # 推送master分支代码到远端 git push origin --tags # 推送tag到远端
此时GitFlow工做流为:
(3)这里能够继续develop分支,并不断push到远端。此时若是团队成员增长,多人须要开发不一样的功能,这里就会用到feature分支。团队中的每一个人都从Github克隆一个项目,而后新建本身的feature分支。
git clone xxxx.git git checkout develop git checkout -b feature-xx develop # 从develop分支新建并检出feature分支
此时“xianhu”作以下操做,并首先第一个提交到了Github远端:
git checkout -b feature-hu develop # 从develop分支新建并检出feature分支 # 这里能够进行一些功能开发,并不断的add和commit git checkout develop # 切换回develop分支 git pull origin develop # 更新远端代码,看develop分支是否有更新(无更新) git checkout feature-hu # 切换回feature分支 git rebase develop # 合并develop分支到feature分支,并解决冲突(无冲突) git checkout develop # 切换回develop分支 git merge --no-ff feature-hu # 合并feature分支到develop分支 git push origin develop # 推送develop分支到远端
此时的GitFlow工做流为:
对于团队其余成员,好比zz,操做以下,并打算在“xianhu”提交后进行push操做:
git checkout -b feature-zz develop # 从develop分支新建并检出feature分支 # 这里能够进行一些功能开发,并不断的add和commit git checkout develop # 切换回develop分支 git pull origin develop # 更新远端代码,看develop分支是否有更新(有更新) git checkout feature-hu # 切换回feature分支 git rebase develop # 合并develop分支到feature分支,并解决冲突(有冲突) # 这里须要进行冲突解决 git add . # 解决完冲突以后执行add操做 git rebase --continue # 继续刚才的rebase操做 git checkout develop # 切换回develop分支 git merge --no-ff feature-zz # 合并feature分支到develop分支(无冲突) git push origin develop # 推送develop分支到远端
若是团队成员在合并feature分支到develop分支后还须要继续开发,则检出本身的feature分支继续操做,并重复上述过程便可。这里须要注意--no-ff参数,其目的是让commit的流程更加清晰,具体为何可自行百度。
xianhu这边进行pull操做,便可看到zz进行的操做。此时的GitFlow工做流为:
(4)若是此时须要进行测试、发版操做,则须要再次新建并检出release分支,重复(2)的步骤。完成以后的GitFlow工做流为:
这里就完成了从版本v0.1到v1.0的迭代开发,并详细解释了如何利用Git+Github进行团队协做开发。文章中没有用到fix分支,这种分支的用法和feature分支相似,你们能够本身体会。
最后详细解释一下上张图:
这里只用到和解释了GitFlow工做流,团队协做开发也能够用Pull Requests或者其余方式,找一个合适本身团队和具体业务的协做方式便可。另外,Git博大精深,想要彻底精通也绝非易事,只能是一边学一边用。
来自:https://zhuanlan.zhihu.com/p/23478654