为什么Mercurial合并变更集包含没有冲突的项



给定此存储库:

A1 - A2 - A3 - A4 - A5

你做hg pull,它从远程回购中再引入两个变更集,给你两个头:

A1 - A2 - A3 - A4 - A5
        
          B3 - B4

假设你做hg merge,它会给你M1合并变更集:

A1 - A2 - A3 - A4 - A5----
                           M1
          B3 - B4 --------/

所以现在hg out将列出M1…

如果你做hg diff -c M1,你会看到:

  • B3和B4中添加的文件
  • B3和B4中修改的文件没有冲突(A3-A5中没有修改文件)的差异

为什么M1合并变更集包含这些项目?为什么需要将此变更集推送到远程存储库?

这些更改已经在远程存储库中的B3和B4中。我理解为什么合并变更集会包括A3-A5和B3-B4都发生了更改的文件,并导致文件的新合并版本。但我不明白为什么变更集会包含没有冲突的项目。M3的推送不会复制远程回购中已经存在的更改吗?

我认为最简单的说法是B3和B4以A2为基础构建它们的更改。为了使所有内容返回到1头而不是2头,合并表示一个变更集,它接受B3和B4中的所有更改,并将它们应用于A5之上。

另一部分原因是,当你合并B4时,你在A5上。如果您在B4上并进行了合并,则合并会在B4的顶部显示A3、A4和A5的更改(当您调用hg diff -c M1时,您将在B4上)。

不,推动合并不会以任何你会注意到的冗余方式真正复制更改。我唯一一次看到重复的更改是当有人重新设置他们从其他地方提取或已经推送的更改集的基础时。

diff -c只在变更集和它的第一个(左)父级(本例中为A5)之间创建差异。因此,它显示了由于从远程进行合并而在分支上发生的所有更改。

最新更新