假设我在开头有以下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。我明白合并完全没问题。所以问题是'重新'做什么与'合并'有什么不同?
答案 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并将其检出到工作目录的效果。