git:merge和rebase之间的区别

时间:2014-03-25 14:46:22

标签: git branch

假设我在开头有以下git树:

A -- B -- C -- D

我创建了一个新分支:

git branch newbr

然后我又提交了一个更改为master并切换到newbr

A -- B -- C -- D -- E

git checkout newbr

在这个阶段,我似乎有两种方法将'D'纳入newbr。 'git merge master'和'git rebase master'。这两者有什么区别?

PS。我明白合并完全没问题。所以问题是'重新'做什么与'合并'有什么不同?

2 个答案:

答案 0 :(得分:1)

git rebase实际上重放当前分支的提交,从指定分支的提交开始,在指定分支的顶部。因此,一个rebase重写原始历史记录并重新计算每个提交的哈希值,因为它适用于它们。所以在你的情况下,newbr从不与master分开,所以没有什么可做的。

但是,如果newbr像这样提交D1,D2和D3:

           D1--D2--D3 (newbr)
          /
A--B--C--D--E (master)

然后你做了“git checkout newbr”,然后“获得rebase master”git将重放D1,D2,然后在主人头顶部再现D3,这是在E,你会得到这个:

              (master)    (newbr)
             /           /
A--B--C--D--E--D1--D2--D3

因此,D1的父级现在不同,因此它具有不同的哈希,而不是保留分支历史的合并。另外,请注意执行rebase与合并时没有其他合并提交。希望这会有所帮助。

答案 1 :(得分:1)

从高级别的角度来看,git merge预先设置了两个分支的先前提交并添加了合并提交,因此在组合两个公共分支时应始终使用它。 git rebase抛弃一个分支,将其重写在另一个分支之上,因此您只应在私有分支上使用它。由于它没有添加合并提交,因此在将以前的私有功能分支推送到公共存储库时,git rebase稍微优先。

在您的情况下,两个命令都是相同的,因为git merge将执行“快进”(不需要合并提交),git rebase将重新设置零提交。两者都具有更新newbr以指向E并将其检出到工作目录的效果。