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

时间:2011-06-03 22:27:00

标签: mercurial merge

鉴于此存储库:

A1 - A2 - A3 - A4 - A5

..你做hg pull从远程仓库中获取另外两个变更集,给你两个脑袋:

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

假设您hg merge可以获得M1 merge changeset

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的推送是否会复制远程仓库中已有的更改?

2 个答案:

答案 0 :(得分:5)

我能想到的最简单的方法是B3和B4将A2作为构建其变更的基础。为了将所有内容都恢复到1个头而不是2个,合并代表一个变更集,它接受B3和B4中的所有更改并将它们应用于A5之上。

看起来这样的原因的另一部分是你在合并B4时在A5上。如果您已经在B4上进行合并,则合并将在B4之上显示A3,A4和A5的更改(当您调用hg diff -c M1时,您将在B4上)。

不,推动合并并不会以任何你注意到的冗余方式重复更改。我看到重复更改的唯一一次是当有人重新调整他们从其他地方撤出或已经推动的变更集时。

答案 1 :(得分:1)

diff -c仅在变更集与其第一个(左)父级(在您的情况下为A5)之间创建差异。因此,它显示了由于远程合并而在您的分支上发生了更改的所有内容。