我是Git的新手学习者。我正在阅读[https://git-scm.com/book/en/v2]上的书,现在在“ 3.6变基”一章中。
本章重点:
请注意,您最终获得的最终快照所指向的快照(无论是重新进行基础的最后一次提交或合并后的最终合并提交)都是相同的快照–只是历史记录不同
我认为这并非在所有情况下都是正确的。让我们看看下面的情况。
假设我们在两个分支C0
和master
上的提交test
上。我们有一个空的foo
文本文件。
接下来,我们检出master
,向"line 1"
写入文本foo
并提交C1
。然后,我们检出test
,还将文本"line 1"
写入foo
,提交C2
。之后,我们从foo中删除文本"line 1"
,提交C3
。
现在的历史
C0---C1 master
\
C2---C3 test-HEAD
现在我们有2个案件要提出:
使用git merge master
的合并:Git将合并的结果带到C4
。 foo
的内容现在是"line 1"
。现在的历史记录:
C0---C1 master
| \
C2--C3--C4 test
使用git rebase master
的重定基调:重定基定后的最后提交是C3'
。 foo
的内容现在为空。现在的历史记录:
C0---C1 master
\
C2'---C3' test
您会看到,快照C4
指向的快照和C3'
指向的快照并不相同,因为foo
中C4
的内容与{{1} foo
中的}。因此,我认为以上引用的句子在这种情况下不正确。
我有什么问题吗?谢谢。
P / s:我的英语不是很好,所以如果我的写作不好,请原谅我。
答案 0 :(得分:1)
使用git rebase master进行的重新设置:重新设置之后的最后一次提交是C3'。 foo的内容现在为空。
不。 C2'尝试将“ line1”添加到文件中,但是它已经包含此行,因此您会遇到冲突。根据解决冲突的方式,结果可能会有所不同。如果您决定同时保留“ line1”行(C1中的一行,以及您要在C2中添加的那一行),那么C3'将删除其中的一行(同样,您会遇到冲突,这取决于如何您将其解决),然后您将获得“ line1”作为内容。
我认为您的错误是认为C3和C3'对应于同一快照。他们不同意:他们对应相同的补丁,即父母之间的差异相同。
最重要的是:rebase
可能比merge
产生更多冲突,尤其是在历史记录采用一种方式并在以后取消的情况下。如果没有冲突,则rebase
和merge
的最终结果必须相同。