'git merge'和'git rebase'有什么区别?

git mergegit rebase什么区别?


假设原来有3个提交, ABC

然后开发人员Dan创建了提交D ,并且开发人员Ed创建了提交E

A-B-C-d-E

显然,这个冲突应该以某种方式解决。 为此,有两种方法:

MERGE

A-B-C-d-E-M

提交DE都仍在此处,但我们创建了合并提交M ,它继承了DE更改。 但是,这会产生钻石形状,许多人都觉得很混乱。

REBASE

A-B-C-d-E-R

我们创建提交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使它看起来好像你清晰地检查了自己的分支,然后做所有的工作从那里开始。 这使得人们可以查看一个干净的,概念上简单的变化包。 当分支有新的变化时,您可以再次重复这一过程,并且您总是会得到一组干净的“分支尖端”变化。
  • 当您分支合并到您的分支中时,此时将两个分支历史绑定在一起。 如果稍后再做更多更改,则会开始创建一个交织线历史记录:它们的一些更改,一些更改以及一些更改。 有些人觉得这很混乱或不受欢迎。
  • 出于我不明白的原因,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