分支的新建与合并
让我们来看一个简单的分支新建与分支合并的例子,实际工作中你可能会用到类似的工作流。
新建分支
在一个新目录中,执行如下指令,(每次git add前,创建对应的文件)。
$ git init
$ git add A.txt
$ git commit -m "Initial Commit Add A.txt"
$ git add B.txt
$ git commit -m "Add B.txt"
$ git add C.txt
$ git commit -m "Add C.txt"
//4f79752 第一次提交的校验和。git bash查看提交历史会显示。
$ git tag C0 4f79752
//a7c4574 第二次提交的校验和。
$ git tag C1 a7c4574
//36b2f09 第三次提交的校验和
$ git tag C2 36b2f09
$ git checkout -b -iss53
$ git add D.txt
$ git commit -m "Add D.txt"
$ git tag C3
$ git checkout master
$ git checkout -b hotfix
$ git add E.txt
$ git commit -m "Add E.txt"
$ git tag C4
//最终结果
$ git log --oneline --graph --all
* 4495315 (HEAD -> hotfix, tag: C4) Add E.txt
| * 89a5b9c (tag: C3, iss53) Add D.txt
|/
* 36b2f09 (tag: C2, master) Add C.txt
* a7c4574 (tag: C1) Add B.txt
* 4f79752 (tag: C0) Initial Commit Add A.txt
效果图:

Figure 21. 基于 master 分支的紧急问题分支 hotfix branch
你可以运行你的测试,确保你的修改是正确的,然后将 hotfix 分支合并回你的 master 分支来部署到线上。 你可以使用 git merge 命令来达到上述目的:
$ git checkout master
$ git merge hotfix
$ git log --oneline --graph --all
* 4495315 (HEAD -> master, tag: C4, hotfix) Add E.txt
| * 89a5b9c (tag: C3, iss53) Add D.txt
|/
* 36b2f09 (tag: C2) Add C.txt
* a7c4574 (tag: C1) Add B.txt
* 4f79752 (tag: C0) Initial Commit Add A.txt
在合并的时候,你应该注意到了“快进(fast-forward)”这个词。 由于你想要合并的分支 hotfix 所指向的提交 C4 是你所在的提交 C2 的直接后继, 因此 Git 会直接将指针向前移动。换句话说,当你试图合并两个分支时, 如果顺着一个分支走下去能够到达另一个分支,那么 Git 在合并两者的时候, 只会简单的将指针向前推进(指针右移),因为这种情况下的合并操作没有需要解决的分歧——这就叫做 “快进(fast-forward)”。

Figure 22. master 被快进到 hotfix
$ git branch -d hotfix
$ git checkout iss53
//注意此出暂存的E.txt和C4处的E.txt都是空文件,所以合并时不会冲突
$ git add E.txt
$ git commit -m "Add E.txt at tag C5"
$ git tag C5
$ git checkout master
$ git merge iss53
$ git log --oneline --graph --all
* 8b528fa (HEAD -> master) Merge branch 'iss53' into master
|\
| * 988427a (tag: C5, iss53) Add E.txt at tag C5
| * 89a5b9c (tag: C3) Add D.txt
* | 4495315 (tag: C4) Add E.txt
|/
* 36b2f09 (tag: C2) Add C.txt
* a7c4574 (tag: C1) Add B.txt
* 4f79752 (tag: C0) Initial Commit Add A.txt

Figure 24. 一次典型合并中所用到的三个快照
这和你之前合并 hotfix 分支的时候看起来有一点不一样。 在这种情况下,你的开发历史从一个更早的地方开始分叉开来(diverged)。 因为,master 分支所在提交并不是 iss53 分支所在提交的直接祖先,Git 不得不做一些额外的工作。 出现这种情况的时候,Git 会使用两个分支的末端所指的快照(C4 和 C5)以及这两个分支的公共祖先(C2),做一个简单的三方合并。
Git 将此次三方合并的结果做了一个新的快照并且自动创建一个新的提交指向它。 这个被称作一次合并提交,它的特别之处在于他有不止一个父提交。

Figure 25. 一个合并提交
遇到冲突时的分支合并
有时候合并操作不会如此顺利。 如果你在两个不同的分支中,对同一个文件的同一个部分进行了不同的修改,Git 就没法干净的合并它们。
本文详细介绍如何在Git中创建和合并分支,包括新建分支、进行快速前进合并以及解决合并冲突的过程。通过实例演示了如何在不同分支上进行开发,并将紧急修复和特性分支合并到主分支。

被折叠的 条评论
为什么被折叠?



