【问题标题】:Understanding the Mercurial merge changeset了解 Mercurial 合并变更集
【发布时间】:2011-04-21 03:40:39
【问题描述】:

如果我的 repo 中有两个头 - C 和 D,它们具有 B 的共同父级 - 我执行 hg merge 然后是 hg commit,那么合并变更集中到底有什么?我试图了解我看到我在做什么hg diff -c xyz 其中 xyz 是合并变更集的 id。

变更集是否会显示在 C 和 D 中修改的所有文件的差异与这些文件在公共父存储库 B 中存在的状态?

【问题讨论】:

  • 顺便说一句,如果您想将两个分支的更改相对于它们的共同祖先合并(例如 C 和 D 与 B),请使用 hg diff -r "ancestor(p1(REV), p2(REV))" 其中 REV 是一个合并变更集。

标签: mercurial merge


【解决方案1】:

一个合并提交有两个父级,因此在运行 diff 时,了解您要针对哪个父级进行 diff 非常重要。

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

来自hg help diff

diff 可能会产生意想不到的结果 用于合并,因为它将默认为 与工作比较 目录的第一个父变更集 if 没有指定修订。

要针对特定​​父级进行差异化,最好提供合并变更集和相关父级的显式修订(例如hg diff -r <parent> -r <merge changeset>

【讨论】:

  • 谢谢。 Mercurial 使用什么逻辑来设置哪个头被设置为父 #1 和父 #2?似乎小费通常是父母#2。因此差异将针对较旧的变更集。这对我来说很有意义。
  • @Marcus:合并是有方向的。典型的合并工作流程是hg update -r <changeset 1>; hg merge -r <changeset 2>; hg commit -m "merged branch"。在此示例中,“父 1”为 <changeset 1>,“父 2”为 <changeset 2>
【解决方案2】:

Mercurial 实现了directed acyclic graph,因此在您的合并变更集中取决于您来自哪里。当您键入“hg merge”时,它假定为“tip”(与 hg pull 假定您克隆头部的根存储库的方式非常相似)如果您键入“hg head”,您可以看到哪个是tip。当您执行此合并时,假设 C 作为提示,您正在合并来自 D 的更改。

【讨论】:

  • 我觉得我看到了不同的结果。假设我的仓库中有 A->B->D,然后我添加了 C 的 hg pull,所以现在我有 B->D 和 B->C,其中 C 是小费。现在我做hg mergehg cihg diff -c xxx - 我觉得在我的差异中它列出了来自 C 的新文件作为添加,从 C 中删除的文件作为删除,以及来自 C 的任何更改作为更改。在逻辑上,差异 C 是“之前”,合并的结果是“之后”。这是你描述的吗?
  • 是的。如果您在 Web 浏览器中转到源代码控制(最初克隆的位置),您可以单击侧面的图表以查看此内容的可视化表示。
猜你喜欢
  • 1970-01-01
  • 2013-05-27
  • 1970-01-01
  • 2011-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多