分支的新建与合并
实际工作中你可能会用到类似的工作流:
- 开发某个网站。
- 为实现某个新的用户需求,创建一个分支。
- 在这个分支上开展工作。
正在此时,你突然接到一个电话说有个很严重的问题需要紧急修补。 你将按照如下方式来处理:
- 切换到你的线上分支(production branch)。
- 为这个紧急任务新建一个分支,并在其中修复它。
- 在紧急问题测试通过之后,切换回线上分支,然后合并这个修补分支,最后将改动推送到线上分支。
- 切换回你最初工作的分支上,继续工作。
新建分支
- 现在,你已经决定要解决你的公司使用的开发任务追踪系统中的 #53 任务。 想要新建一个分支并同时切换到那个分支上,你可以运行一个带有 -b 参数的 git checkout 命令:
git checkout -b iss53 (为实现某个新的用户需求,创建一个分支)
它是下面两条命令的简写:
git branch iss53
git checkout iss53
此时对于你本地git仓库来说, 分支数据状态是这样:master分支和iss53分支数据是一致的
2. 在iss53分支开发任务并提交修改,此时对于你本地git仓库来说, 分支数据状态是这样:(你的 HEAD 指针指向了 iss53 分支)
3. 接到电话,紧急修复生产问题
你不必把这个紧急问题和 iss53 的修改混在一起, 你也不需要还原关于 iss53 任务的修改,然后再添加关于这个紧急问题的修改,最后将这个修改提交到线上分支。 你所要做的仅仅是切换回 master 分支。
但是,在你这么做之前,要留意你的工作目录和暂存区里那些还没有被提交的修改, 它可能会和你即将检出的分支产生冲突从而阻止 Git 切换到该分支。
- 最好的方法是,在你切换分支之前,保持好一个干净的状态。
- 有一些方法可以绕过这个问题(贮藏(stashing) 和 修补提交(commit amending))
现在假设你的修改全部提交了,此时你可以切换到master分支了。
git checkout master
- 新建紧急问题分支,在紧急问题分支开发并提交
git merge hotfix: 将hotfix分支合并到当前分支(master分支)
此时你的git仓库数据状态如下:
接下来你就可以在这个紧急问题分支上面进行开发,开发完提交代码就行:
测试完没问题可以将紧急分支开发内容合并到master分支:
先切换到master分支,切换到master之后将hotfix分支的修改合并到master分支
此时,你的git仓库数据状态如下:
5. 此时你已经修复完了紧急问题,需要切换回到修复紧急问题之前的开发任务分支
在开发任务分支继续开发,提交代码之后的git仓库数据状态如下:
此时在紧急任务分支提交的代码没有合并到开发任务分支,如果需要将紧急分支开发的代码合并到开发任务分支可以如下操作:
git merge master(将master分支代码合并到开发任务分支)或者可以等到开发任务分支开发完之后使用如下操作将开发任务分支合并到master分支:
git checkout master
git merge iss53
-
开发任务分支代码已经合并到master分支,如果不需要开发任务分支可以删除:
git branch -d iss53 -
在分支合并过程中遇见冲突
如果在两个分支中对同一个文件的同一个部分进行了不同的修改,在两个分支合并过程中可能会遇见冲突,如下:
此时,Git 会暂停下来,等待你去解决合并产生的冲突。 你可以在合并冲突后的任意时刻使用 git status 命令来查看那些因包含合并冲突而处于未合并(unmerged)状态的文件
合并冲突的文件如下:
====上半部分指当前分支内容,上面例子是把iss53分支内容合并到master分支,所以当前分支是master分支
====下半部分是iss53分支内容
一般的冲突修改是保留其中一个分支的修改,并删除 <<<<<<< , ======= , 和 >>>>>>> 这些行,冲突解决后文件内容效果如下:
在你解决了所有文件里的冲突之后,对每个文件使用 git add 命令来将其标记为冲突已解决。 一旦暂存这些原本有冲突的文件,Git 就会将它们标记为冲突已解决。
分支管理
git branch 命令不只是可以创建与删除分支。 如果不加任何参数运行它,会得到当前所有分支的一个列表:
如果需要查看每一个分支的最后一次提交,可以运行 git branch -v 命令:
如果要查看哪些分支已经合并到当前分支,可以运行 git branch --merged:
因为之前已经合并了 iss53 分支,所以它在列表中。 在这个列表中分支名字前没有 * 号的分支通常可以使用 git branch -d 删除掉;你已经将它们的工作整合到了另一个分支,所以并不会失去任何东西。
查看所有包含未合并工作的分支,可以运行 git branch --no-merged:
因为它包含了还未合并的工作,尝试使用 git branch -d 命令删除它时会失败:
如果真的想要删除分支并丢掉那些工作,如同帮助信息里所指出的,可以使用 -D 选项强制删除它。