【问题标题】:Understanding Mercurial merging logic了解 Mercurial 合并逻辑
【发布时间】:2011-04-08 02:56:27
【问题描述】:

假设myfile 在两个存储库(A 和 B)中进行了修改。在 A 中,我们使用 hg pull ../B 获取这些变更集:

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

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

现在如果有冲突,Mercurial 会启动我们的合并工具(Beyond Compare),我们会得到三个视图:左侧是本地视图,中心是父视图,右侧是“其他”视图。给定我们的结构,左边(本地)是 A5,中心(父)是 A2,右边(其他)是 B4?

其次,Mercurial 用于确定是否需要合并的具体逻辑是什么?它是否看到有两个版本的myfile 没有任何孩子?又是如何确定A2是父节点的呢?

【问题讨论】:

    标签: mercurial merge


    【解决方案1】:

    Merge Tool Configuration中所述

    合并工具使用 args 的参数列表运行,其中扩展了以下变量:

    • $output 扩展为已包含第一个父版本的现有文件 - 这也是合并结果结束/必须结束的地方
    • $local 扩展为 file.orig,它是作为工作目录版本中文件的副本创建的 - 因此它包含来自第一个父级的未合并版本
    • $base 扩展为 /tmp/file~base.*,它是使用共同祖先修订版 (see hg debugancestor) 中的版本创建的
    • $other 扩展为/tmp/file~other.*,它是使用与第一个父级合并的新的第二个父修订版中的版本创建的

    (所以是的,“左(本地)为 A5,中心(父)为 A2,右(其他)为 B4”)

    (见“performing the merge”)

    【讨论】:

    • 谢谢。 Mercurial 如何准确地知道哪些文件需要合并?在我的示例中,它会合并变更集中B3B4 中的所有修改文件吗? Mercurial 将使用什么逻辑来确定文件是否在B4A4 中被修改,共同父对象是A2?直观地,人们可以通过查看图表来判断这一点,但我很好奇 Mercurial 确定这一点的逻辑到底是什么。
    • @Marcus: Mercurial 只需要比较目录或文件 SHA1 来判断它们是否不同(并且需要合并):参见hgbook.red-bean.com/read/…。 Mercurial 会从父变更集返回到父变更集,从两个HEAD 开始进行合并,直到找到共同的祖先。
    猜你喜欢
    • 1970-01-01
    • 2013-11-15
    • 2018-10-15
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    相关资源
    最近更新 更多