git merge
和git rebase
之间有什么区别?
答案 0 :(得分:795)
假设最初有3次提交,A
,B
,C
:
然后开发人员Dan创建了提交D
,开发人员Ed创建了提交E
:
显然,这种冲突应该以某种方式解决。为此,有两种方式:
<强>合并强>:
提交D
和E
仍在此处,但我们创建合并提交M
,继承D
和E
的更改。但是,这会创建菱形形状,很多人会觉得很困惑。
<强> REBASE 强>:
我们创建了提交R
,其实际文件内容与上面的合并提交M
相同。但是,我们摆脱了提交E
,就像它从未存在过一样(用点表示 - 消失线)。由于这种消失,E
应该是开发人员Ed本地的,并且应该从未被推送到任何其他存储库。 rebase的优势在于避免了菱形形状,并且历史保持良好的直线 - 大多数开发人员都喜欢它!
答案 1 :(得分:139)
我真的很喜欢10 Things I hate about git中的这段摘录(它在第二个例子中给出了关于rebase的简短解释):
3。蹩脚的文档
手册页是一个万能的“f *** you” 1 。他们从计算机科学家的角度描述命令,而不是用户。一个很好的例子:
git-push – Update remote refs along with associated objects
以下是对人类的描述:
git-push – Upload changes from your local repository into a remote repository
更新,另一个例子:(谢谢cgd)
git-rebase – Forward-port local commits to the updated upstream head
翻译:
git-rebase – Sequentially regenerate a series of commits so they can be applied directly to the head node
然后我们
git-merge - Join two or more development histories together
这是一个很好的描述。
1。未经审查的原始
答案 2 :(得分:112)
就我个人而言,我没有发现标准图表技术非常有用 - 箭头似乎总是指向我错误的方式。 (它们通常指向每个提交的“父”,最终会及时倒退,这很奇怪)。
用文字解释:
由于我不明白的原因,Git的GUI工具从未花费太多精力来更清晰地呈现合并历史,从而抽象出各个合并。因此,如果您想要“干净的历史记录”,则需要使用rebase。
我似乎记得读过那些仅使用rebase的程序员和从不使用rebase的其他程序员的博客文章。
我会用一个简单的例子来解释这个问题。假设您项目中的其他人正在使用用户界面,并且您正在编写文档。没有rebase,你的历史可能看起来像:
Write tutorial
Merge remote-tracking branch 'origin/master' into fixdocs
Bigger buttons
Drop down list
Extend README
Merge remote-tracking branch 'origin/master' into fixdocs
Make window larger
Fix a mistake in howto.md
也就是说,文档中间的合并和UI提交会提交。
如果您将代码重新设置为master而不是合并它,它将如下所示:
Write tutorial
Extend README
Fix a mistake in howto.md
Bigger buttons
Drop down list
Make window larger
所有提交都位于顶部(最新),然后是master
分支的其余部分。
(免责声明:我是“我讨厌Git的10件事”的作者,在另一个答案中提及了)
答案 3 :(得分:37)
虽然接受且最受欢迎的答案很棒,但我还发现尝试用单词解释差异很有用:
<强>合并强>
<强>底垫强>
摘要:如果可能,rebase几乎总是更好。使重新集成到主分支更容易。
由于? ➝您的功能工作可以显示为主要分支的一个大'补丁文件'(又名差异),而不必“解释”多个父母:至少两个,来自一个合并,但如果有几次合并,可能会更多。 与合并不同,多个rebase不会相加。 (另一大优点)
答案 4 :(得分:13)
Git rebase更接近合并。 rebase的区别在于:
这意味着在所有远程提交之后,所有本地提交都会移动到最后。如果你有合并冲突,你也必须解决它。
答案 5 :(得分:5)
答案 6 :(得分:1)
合并与变基的并排说明
请注意上述变基场景中 C5 和 C6 的更新哈希值。
有关该主题的完整详细信息和动画,我已经单独写了一篇文章:https://betterprogramming.pub/differences-between-git-merge-and-rebase-and-why-you-should-care-ae41d96237b6
答案 7 :(得分:0)
我在git rebase vs merge 上发现了一篇非常有趣的文章,认为要分享它here