git merge
在 Git 中合并两个分支时会产生一个特殊的提交记录,它有两个父节点。翻译成自然语言相当于:“我要把这两个父节点本身及它们所有的祖先都包含进来。”
如下图例子所示,我们准备了两个分支,每个分支上各有一个独有的提交。这意味着没有一个分支包含了我们修改的所有内容。咱们通过合并这两个分支来解决这个问题。
我们要把 bugFix
合并到 master
里,当前分支是master分支,我们执行命令
git merge bugFix
master
现在指向了一个拥有两个父节点的提交记录。假如从 master
开始沿着箭头向上看,在到达起点的路上会经过所有的提交记录。这意味着 master
包含了对代码库的所有修改 。
咱们再把 master
分支合并到 bugFix
git checkout bugFix
git merge master
因为 master
继承自 bugFix
,Git 什么都不用做,只是简单地把 bugFix
移动到 master
所指向的那个提交记录。
现在所有提交记录的颜色都一样了,这表明每一个分支都包含了代码库的所有修改!
git rebase
rebase 实际上就是取出一系列的提交记录,“复制”它们,然后在另外一个地方逐个的放下去。
rebase 的优势就是可以创造更线性的提交历史。
如下图所示例子:准备了两个分支;注意当前所在的分支是 bugFix(星号标识的是当前分支)
我们想要把 bugFix 分支里的工作直接移到 master 分支上。移动以后会使得两个分支的功能看起来像是按顺序开发,但实际上它们是并行开发的。
git rebase master
现在 bugFix 分支上的工作在 master 的最顶端,同时我们也得到了一个更线性的提交序列。
注意:提交记录 C3 依然存在(树上那个半透明的节点),而 C3' 是我们 Rebase 到 master 分支上的 C3 的副本。
现在 master 还没有更新,我们切换到了 master
上。把它 rebase 到 bugFix
分支上
git rebase bugFix
由于 bugFix
继承自 master
,所以 Git 只是简单的把 master
分支的引用向前移动了一下而已。