2011-04-21 41 views
2

如果我的回购中有两个头 - C和D,它们的共同父代为B - 并且我执行hg merge,然后执行hg commit,那么合并变更集究竟是什么?我试图了解我看到我做了什么hg diff -c xyz其中xyz是合并变更集的ID。了解Mercurial合并更改集

changeset是否会显示在C和D中修改的所有文件的差异与这些文件在共同父库B中的状态?

+0

顺便说一句,如果你想获得两个分支的更改合并相对它们的共同祖先(例如C和D对B)使用'hg diff -r'祖先(p1(REV),p2(REV))“',其中REV是一个合并变化集合 – Matt 2011-04-21 20:51:56

回答

3

合并提交有两个父母,所以当运行一个差异时,了解哪一个父母是歧视很重要。

hg diff -c <changeset>显示变更集相对于第一个父级的差异。

hg help diff

差异可能产生合并意想不到的结果 ,仿佛指定 没有修改,则默认为 对工作 目录的第一个父变更比较。

把分差针对特定的父母,最好是同时提供合并变更和corrent父的明确的版本(例如hg diff -r <parent> -r <merge changeset>

+0

谢谢。 Mercurial使用哪种逻辑来设置将哪个头设置为父级#1与父级#2?看来小费通常是父母#2。所以差异将会反对旧的变更集。这对我有意义。 – 2011-04-21 12:55:51

+0

@Marcus:合并是有方向性的。典型的合并工作流程是'hg update -r ; hg merge -r ; hg commit -m“合并分支”。在这个例子中,“父母1”是“”,“父母2”是“”。 – 2011-04-21 13:14:22

2

Mercurial实现了directed acyclic graph,因此在合并变更集中取决于您来自哪里。当你输入“hg merge”时,它会假设“提示”(与hg pull相同,假设你克隆了你的头的根存储库)。如果你输入“hg heads”,你可以看到哪一个是提示。当你做这个合并时,假设C作为提示,你正在合并来自D的改变。

+0

我觉得我看到不同的结果。假设我在我的回购库中有A-> B-> D,那么我做'hg pull',它添加C,所以现在我有B-> D和B-> C,其中C是提示。 '','hg ci','hg diff -c xxx' - 我觉得在我的差异中,将C中的新文件列为ADDS,将C中的文件删除为DELETES,以及将C中的任何更改作为CHANGES。 ogically在差异C是“之前”和合并结果是“之后”。这是你所描述的吗? – 2011-04-21 10:47:25

+0

是的。如果您在网页浏览器中转到源代码管理(从最初克隆的地方),您可以单击侧面的图形以查看此图形的可视化表示。 – 2011-04-21 15:44:21