'git merge'和'git rebase'有什么区别?
git merge
和git rebase
什么区别?
假设原来有3个提交, A
, B
, C
:
然后开发人员Dan创建了提交D
,并且开发人员Ed创建了提交E
:
显然,这个冲突应该以某种方式解决。 为此,有两种方法:
MERGE :
提交D
和E
都仍在此处,但我们创建了合并提交M
,它继承了D
和E
更改。 但是,这会产生钻石形状,许多人都觉得很混乱。
REBASE :
我们创建提交R
,实际的文件内容与上面的合并提交M
相同。 但是,我们摆脱了提交E
,就像它从来没有存在过的那样(用点 - 消失线表示)。 由于这种消除, E
应该是开发人员Ed的本地人员,并且应该从未被推送到任何其他存储库。 rebase的优点是避免了菱形的形状,并且历史保持不错的直线 - 大多数开发人员都喜欢它!
我真的很喜欢这个我讨厌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的博客文章。
例
我会试着用一个简单的例子来解释这个。 假设您的项目中的其他人正在使用用户界面,并且您正在编写文档。 没有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。
如果您将代码重新编码到主服务器上而不是合并它,它将如下所示:
Write tutorial
Extend README
Fix a mistake in howto.md
Bigger buttons
Drop down list
Make window larger
所有的提交都在顶部(最新),其次是master
分支的其余部分。
(免责声明:我是另一个回答中提到的“我讨厌Git的10件事”的作者)
链接地址: http://www.djcxy.com/p/1203.html上一篇: What's the difference between 'git merge' and 'git rebase'?
下一篇: What is the difference between `git merge` and `git merge