【问题标题】:Why does Mercurial sometimes allow merging with an ancestor?为什么 Mercurial 有时允许与祖先合并?
【发布时间】:2012-04-06 22:43:16
【问题描述】:

我对@9​​87654321@ 感到困惑。在该页面上,您会看到一个小分支 file-content,它合并回分支 default,即使其中一个头是另一个头的祖先。

当我尝试做类似的事情时,我会收到一条中止消息,除非

  1. 侧分支已关闭并且
  2. 我从祖先合并到封闭的分支头(但不是相反)。 (在这个抓取存储库中,file-content 分支被标记为非活动,未关闭。)

编辑:我的回答中描述了您可以与祖先合并的真实条件。

那么这里发生了什么?

【问题讨论】:

    标签: mercurial merge branch dvcs


    【解决方案1】:

    您不能与祖先合并没有技术原因:正如您所发现的,Mercurial 在某些情况下确实支持它。所以这纯粹是一个 GUI 限制。这背后的原因是,当hg update 给你的结果与hg merge 相同时,为了简单起见,你应该改用它。

    merge 只是三种存储库状态的混合:共同祖先和您要合并的两个变更集。三路合并是逐块完成的。本地与远程合并的表格如下所示:

    ancestor  local  remote -> merge
    old       old    old       old (nobody changed the hunk)
    old       new    old       new (I changed the hunk)
    old       old    new       new (you changed the hunk)
    old       new    new       new (hunk was cherry picked onto both branches)
    old       foo    bar       <!> (conflict, both changed hunk but differently)
    

    如果local 是remote 的祖先,那么ancestor == local。所以表格变成:

    ancestor  local  remote -> merge
    old       old    old       old (nobody changed the hunk)
    old       old    new       new (you changed the hunk)
    

    在这两种情况下,merge 列都包含 remote 列中的内容。在您的示例中,local 是 default 和 remote 是 file-content:

    $ hg update default
    $ hg merge file-content
    

    结果是一个类似于file-content 的合并变更集。

    【讨论】:

    • 请求同时发布此主题
    • 那么在这个例子中使用了哪些命令来获取这个变更集历史?我无法在命令行重新创建它。
    【解决方案2】:

    奇怪的是,文档记录很差,但是如果您点击https://www.mercurial-scm.org/wiki/Merge 底部的链接,您会看到禁止与祖先合并的规则有一个例外。正如我最初推测的那样,它不需要后代是一个封闭的分支。而是:

    1. 您必须从祖先合并(即工作目录必须更新为祖先,而不是其他变更集)
    2. 工作目录的父目录和要合并的变更集的分支名称必须不同。例如。一个具有默认分支名称,另一个具有分支名称功能-X

    因此,这使我们能够启动一个新分支并将其合并回来,即使我们在此期间没有对原始分支进行任何操作。

    【讨论】:

      猜你喜欢
      • 2011-10-08
      • 1970-01-01
      • 1970-01-01
      • 2021-10-07
      • 2020-08-10
      • 2012-07-20
      • 2021-01-07
      • 1970-01-01
      • 2013-11-17
      相关资源
      最近更新 更多