rebase和合并的最后一次提交的快照是否相同?

时间:2018-10-08 15:22:33

标签: git

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

本章重点:

  

请注意,您最终获得的最终快照所指向的快照(无论是重新进行基础的最后一次提交或合并后的最终合并提交)都是相同的快照–只是历史记录不同

我认为这并非在所有情况下都是正确的。让我们看看下面的情况。

假设我们在两个分支C0master上的提交test上。我们有一个空的foo文本文件。

接下来,我们检出master,向"line 1"写入文本foo并提交C1。然后,我们检出test,还将文本"line 1"写入foo,提交C2。之后,我们从foo中删除文本"line 1",提交C3

现在的历史

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

现在我们有2个案件要提出:

  1. 使用git merge master的合并:Git将合并的结果带到C4foo的内容现在是"line 1"。现在的历史记录:

    C0---C1 master
    |      \
    C2--C3--C4 test
    
  2. 使用git rebase master的重定基调:重定基定后的最后提交是C3'foo的内容现在为空。现在的历史记录:

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

您会看到,快照C4指向的快照和C3'指向的快照并不相同,因为fooC4的内容与{{1} foo中的}。因此,我认为以上引用的句子在这种情况下不正确。

我有什么问题吗?谢谢。

P / s:我的英语不是很好,所以如果我的写作不好,请原谅我。

1 个答案:

答案 0 :(得分:1)

  

使用git rebase master进行的重新设置:重新设置之后的最后一次提交是C3'。 foo的内容现在为空。

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

我认为您的错误是认为C3和C3'对应于同一快照。他们不同意:他们对应相同的补丁,即父母之间的差异相同。

最重要的是:rebase可能比merge产生更多冲突,尤其是在历史记录采用一种方式并在以后取消的情况下。如果没有冲突,则rebasemerge的最终结果必须相同。