【问题标题】:git: difference between merge and rebase [duplicate]git:合并和变基之间的区别[重复]
【发布时间】:2014-05-03 12:00:42
【问题描述】:

假设我在开头有以下 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。我理解合并非常好。所以问题是“rebased”与“merge”有什么不同?

【问题讨论】:

标签: git branch


【解决方案1】:

git rebase 实际上会重放当前分支的提交,从与指定分支分歧的提交开始,在指定分支之上。因此,rebase 会重写原始历史记录并在应用它们时重新计算每个提交的哈希值。因此,在您的情况下,newbr 从未与 master 分歧,因此无事可做。

但是,如果 newbr 有这样的提交 D1、D2 和 D3:

           D1--D2--D3 (newbr)
          /
A--B--C--D--E (master)

然后你做了“git checkout newbr”,然后“get rebase master” git 将重放 D1、D2,然后是 D3 在主人的头顶上,在 E 上,你会得到这个:

              (master)    (newbr)
             /           /
A--B--C--D--E--D1--D2--D3

所以 D1 的父级现在不同了,因此它具有不同的哈希值,而不是保留分支历史的合并。另外,请注意在执行变基与合并时没有额外的合并提交。希望这会有所帮助。

【讨论】:

    【解决方案2】:

    从高层次的角度来看,git merge 保留了来自两个分支的先前提交并添加了一个合并提交,因此在合并两个公共分支时应该始终使用它。 git rebase 丢弃一个分支,在另一个分支之上重写它,所以你应该只在私有分支上使用它。由于它不添加合并提交,git rebase 在将以前的私有功能分支推送到公共存储库时会稍微好一些。

    在您的情况下,这两个命令是相同的,因为git merge 会执行“快进”(不需要合并提交),而git rebase 会重新设置零提交。两者都具有更新newbr 以指向E 并将其检出到工作目录的效果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-28
      • 2020-01-02
      • 2019-03-11
      • 2020-02-13
      • 2015-04-01
      • 2021-06-14
      • 2018-07-09
      • 1970-01-01
      相关资源
      最近更新 更多