git merge
和之间有什么区别git rebase
?
git merge
和之间有什么区别git rebase
?
Answers:
假设原来有3个提交,A
,B
,C
:
然后,开发人员Dan创建了commit D
,而开发人员Ed创建了commit E
:
显然,这种冲突应该以某种方式解决。为此,有两种方法:
合并:
两个提交D
和E
仍在此处,但是我们创建了合并提交M
,该合并提交继承了D
和的更改E
。但是,这会产生菱形,许多人感到非常困惑。
REBASE:
我们创建commit R
,其实际文件内容与M
上面的merge commit相同。但是,我们摆脱了commit E
,就像它不存在一样(用点表示-消失线表示)。由于这种淘汰,E
因此对于开发人员Ed来说应该是本地的,并且永远不要被推送到任何其他存储库。变基的优点是避免了钻石形状,并且历史沿直线一直很好-大多数开发人员都喜欢这样做!
git merge
不交错提交(但通过查看可能会出现git log
)。取而代之的是git merge
保持Dan和Ed的两个发展历史不变,这是一次从每个角度来看的结果。git rebase
使得Dan首先从事此工作,而Ed跟随他。在这两种情况下(合并和变基),实际的结果文件树是绝对相同的。
我真的很喜欢我讨厌git的10件事摘录(它在第二个示例中简要介绍了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.未经审查的
我个人认为标准图表绘制技术不是很有用-箭头似乎总是为我指出错误的方向。(它们通常指向每个提交的“父”,最终导致时间倒退,这很奇怪)。
用语言解释:
由于我不明白的原因,用于Git的GUI工具从没有做出太多的努力来更清晰地呈现合并历史,从而抽象出各个合并。因此,如果您需要“干净的历史记录”,则需要使用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的十件事”的作者)
尽管公认的最受好评的答案是不错的,但我发现仅用文字来解释区别也很有用:
合并
重新设定
摘要:可能的话,变基几乎总是更好。使重新集成到主分支变得更加容易。
因为?feature您的特色作品可以相对于主分支显示为一个大的“补丁文件”(又称为diff),而不必“解释”多个父级:至少两个,来自一次合并,但如果有的话,可能更多是几次合并。与合并不同,多个基准不会累加。(另一大优点)
Git rebase更接近合并。rebase的区别是:
因此,这意味着在所有远程提交之后,所有本地提交都将移至末尾。如果您有合并冲突,则也必须解决它。
我在git rebase vs merge上找到了一篇非常有趣的文章,想在这里分享