2011-04-08 93 views
4

假设myfile在两个存储库(A和B)中被修改。在一个我们做的hg pull ../B这会让我们这些变更:了解Mercurial合并逻辑

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

因为我们有两个头(A5,B4),我们做一个hg merge

现在如果有冲突,Mercurial启动我们的合并工具(Beyond Compare),我们得到三个视图:左边是本地,中心是父级,右边是“其他”。考虑到我们的结构,将剩下(本地)为A5,中间(父)为A2,右(其他)为B4?其次,Mercurial用来确定需要合并的逻辑究竟是什么?它是否看到没有任何孩子的myfile有两个版本?它究竟如何确定A2是父母?

回答

5

正如Merge Tool Configuration

合并工具运行与参数的个数下列变量参数列表扩展提到:

  • $output扩展到已经包含了该版本的现有文件第一个父 - 这也是合并的结果最终/必须结束的地方
  • $local扩展到file.orig,该文件创建为工作目录中文件的副本版本 - 它因此包含从所述第一个亲本
  • $基础扩展到其与版本创建从共同的祖先版本(see hg debugancestor
  • $其他膨胀到其与版本从创建的/tmp/file~other.*/tmp/file~base.*未合并版本其中第一父合并

新的第二父版本(所以是的, “左(本地)是A5,中心(父)是A2和右(其他)是B4”)

enter image description here

(参见“performing the merge”)

+0

谢谢。 Mercurial将如何确切知道哪些文件需要合并?在我的例子中,它会合并变更集'B3'和'B4'中的所有修改过的文件吗?如果一个文件在'B4'和'A4'中被修改,共同的父母是'A2',那么M​​ercurial会用什么逻辑来判断?直观地说,人们可以通过查看图表来说明这一点,但我很好奇Mercurial的逻辑究竟是什么决定了这一点。 – 2011-04-08 11:54:56

+0

@Marcus:如果Mercurial不同(并且需要合并),Mercurial只需要比较目录或文件SHA1即可:请参阅http://hgbook.red-bean.com/read/a-tour-of-mercurial-merging -work.html#toggle_id353585。 Mercurial将从父变更集返回父变更集,从两个“HEAD”开始合并,直到找到共同的祖先。 – VonC 2011-04-08 12:11:38