首页 > 解决方案 > rebase 和 merge 的最后一次提交的快照是否相同?

问题描述

我是 Git 的新手学习者。我正在 [ https://git-scm.com/book/en/v2]上阅读这本书,现在我正在阅读“3.6 Rebasing”一章。

本章有一个要点:

请注意,您最终得到的最终提交所指向的快照,无论是 rebase 的最后一个 rebase 提交还是合并后的最终合并提交,都是相同的快照——只是历史记录不同。

我认为并非在所有情况下都是正确的。下面我们来看一个案例。

假设我们C0在 2 个分支上提交,master并且test. 我们有一个空的foo文本文件。

接下来,我们检查master,写一个文本"line 1"foo提交C1。然后我们签出test,还写了一个文本"line 1"foo做一个提交C2。之后,我们"line 1"从 foo 中删除文本,进行提交C3

现在的历史:

C0---C1 master
 \
  C2---C3 test-HEAD

现在我们有 2 个案例要移动:

  1. 使用合并方式git merge master:Git 将合并后的结果带到C4. 现在的内容foo"line 1"。现在的历史:

    C0---C1 master
    |      \
    C2--C3--C4 test
    
  2. 使用变基:变基git rebase master后的最后一次提交是C3'. 现在的内容foo是空的。现在的历史:

    C0---C1 master
          \
           C2'---C3' test
    

可以看到,快照指向的 byC4和 byC3'是不一样的,因为 in 的内容和fooinC4不同。所以我认为上面引用的句子在这种情况下是不正确的。fooC3'

我有什么问题吗?谢谢你。

P/s:我的英文不是很好,所以如果我的写作有不好的地方请见谅。

标签: git

解决方案


使用 git rebase master 的变基:变基后的最后一次提交是 C3'。foo 现在的内容是空的。

没有。C2' 尝试将“line1”添加到文件中,但它已经包含此行,因此您会遇到冲突。根据您解决冲突的方式,结果可能会有所不同。如果您决定保留两个“line1”行(C1 中的一个,以及您在 C2 中添加的那个),那么 C3' 将删除这些行之一(同样,您会遇到冲突,这取决于如何你解决它),你会得到“line1”作为内容。

我认为您的错误是认为 C3 和 C3' 对应于同一个快照。他们没有:他们对应于同一个补丁,即关于他们的父母的相同差异。

底线:rebase可能会产生更多的冲突merge,特别是在历史单向并稍后取消的情况下。当您没有冲突时,rebaseand的最终结果merge必须相同。


推荐阅读