2011-06-03 94 views
2

鉴于此库:为什么Mercurial合并changeset包含没有冲突的项目?

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进行了修改,对文件中的DIFF对于其中有没有冲突(文件没有
    • 文件在A3-A5中修改)

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

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

  • 回答

    5

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

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

    否,推动合并不会真正重复任何你会发现多余的变化。我看到重复更改的唯一时间是有人重新设置了他们从其他地方或已经推出的变更集。

    +0

    谢谢 - 仍然不完全确定为什么这不会重复远程回购中的更改。我猜测混合中有一些Mercurial魔术。 – 2011-06-06 18:04:13

    1

    diff -c只会在变更集与其第一个(左侧)父级(您的案例中的A5)之间创建差异。因此,它显示了由于远程合并而在分支上发生了变化的所有内容。

    +0

    'diff'是“查看”变更集内容的正确方法吗? – 2011-06-07 17:25:14

    +1

    我会说'出口'应该采取那个点。然而,变更集的“内容”是一个相当哲学的问题。实际上,内容只是文件和元数据。 – Ringding 2011-06-08 06:58:43