众所周知,Git的分支是其广受欢迎的的重要原因之一,版本的分支(branch)和合并(merge)可以很方便的对项目进行模块开发。接下来将通过一个小Demo来记录一下自己对于Git分支和合并的使用。
先讲一个需求,项目demo是一个已发布的项目,在远程仓库中发布的分支为master分支,在项目运行过程中出现了两个问题。第一,demo项目出现了一个小BUG;第二,需要扩展一个新功能。这两个问题需要两个程序员(小李修改Bug,小王添加新功能)来单独完成,那么他们应该怎样去合理的使用Git的分支和合并来完成工作呢?
clone项目到本地
小李和小王都将远程仓库的项目通过$ git clone demo
命令克隆到本地仓库。接下来我们想一下,我们是不是要保证项目master的分支不能被修改,还得保证两个人单独完成工作且相互不能影响,最后两个人完成各自任务后提交项目,并能很好的合并呢?要想完成这样的目的就需要借助Git的分支和合并的概念来完成这个需求了。
新建分支
将项目clone到本地以后,小王和小李可以在他们的本地仓库进行新建分支,新建的分支相当于从master分支重新复制一份出来进行各自的操作(但实际并没有复制,是指针的变化)
Git代码解释
// 列出所有本地分支
$ git branch
// 列出所有远程分支
$ git branch -r
// 列出所有本地分支和远程分支
$ git branch -a
// 新建一个分支,但依然停留在当前分支
$ git branch [branch-name]
// 新建一个分支,并切换到该分支
$ git checkout -b [branch]
// 新建一个分支,指向指定commit
$ git branch [branch] [commit]
// 新建一个分支,与指定的远程分支建立追踪关系
$ git branch --track [branch] [remote-branch]
// 切换到指定分支,并更新工作区
$ git checkout [branch-name]
// 切换到上一个分支
$ git checkout -
// 建立追踪关系,在现有分支与指定的远程分支之间
$ git branch --set-upstream [branch] [remote-branch]
// 合并指定分支到当前分支
$ git merge [branch]
// 选择一个commit,合并进当前分支
$ git cherry-pick [commit]
// 删除分支
$ git branch -d [branch-name]
// 删除远程分支
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]
就这样小李和小王各自建立一个分支开始了辛勤的创造。
由于小李只是修改一个bug,多以很快小李就完成了自己的工作,于是他将自己的分支提交到远程仓库中,并且请测试人员去测试。
提交分支到远程仓库
小李完成里本地代码的工作,准备提交代码到远程仓库。但是,此时远程仓库中的master分支可能已经被其他程序员修改了(比如小王提前完成了任务并通过测试已上线,我手动修改了一下远程仓库的master分支的一个文件来模拟这个过程),所以小李需要将远程仓库的mater分支与他自己的分支进行一下合并,以保证他的分支是最新的。
小李合并分支
首先小李将自己的分支切换到master分支,并通过$ git pull
来从远程仓库获取master的最新内容,然后在切回自己的工作分支,执行$ git merge master
将自己的工作分支和最新的master分支进行合并。
小李提交分支
然后小李将自己的分支提交到远程仓库
至此,小李的工作就基本完成了,如果测试通过的话,才算真正完成。
测试人员合并分支并发布
测试人员从远程仓库中clone下小李提交的的工作分支,然后进行测试,经过测试后,测试人员将小李的工作分支和master的工作分支进行合并(注意:小李操作的是他的工作分支和master合并,改变的是他的工作分支;而测试人员操作的是maste分支和小李的工作分支,改变的是master分支),然后可以选择删除小李的工作分支(也可以不删除),最终上线项目。
删除小李的工作分支
这样小李的工作彻底完成了,接下来咱们在看一下小王的工作情况。
小王经过一段时间的拼搏挣扎之后,新功能也完成了,他要做的也是想小李一下提交分支并请测试人员测试,然后再由测试人员合并分支并发布项目,过程和上面一样,下图为模拟流程。
小王的工作:
测试人员的工作:
总结
本文通过小李和小王以及测试人员对一个需求的实际场景进行了模拟Git的分支和合并的操作,其中截图部分代码在实际操作中可能不尽相同,但整个流程就是这样。
本文部分解释和说法借鉴自阮一峰关于Git的博文。
阮一峰关于Git的文章
廖雪峰的Git教程