5

想象一下这个场景:

  1. Alice 和 Bob 都克隆了一个中央主 Mercurial 存储库,其中包含 1 个文本文件
  2. Alice 和 Bob 都对文件中的同一行进行了更改,并提交
  3. Bob 推送回中央存储库,而不是 Alice
  4. Alice 现在拉入她的存储库,注意到她现在有两个头,然后合并
  5. 由于合并是冲突,她解决了冲突
  6. Alice 然后提交但不推送
  7. Bob 现在在文件的其他位置(即,离初始更改不远)对文件进行进一步更改,然后提交并推送
  8. Alice 在她的合并文件中,在 Bob 刚刚更改的同一位置进行了类似的更改,并提交
  9. 爱丽丝拉,并发现另一个双头存储库,她合并

这是上述场景的不同视图

(“CHANGE”后面的数字表示该人更改了文件的“部分X”。如果两个用户都更改了相同的部分,我们将面临合并冲突,如果他们更改不同,则没有那么多)

    爱丽丝鲍勃
    克隆大师 克隆大师
    -----------------------------------------
    改变 1 <-----+
    COMMIT +--即将发生的合并冲突
    ------------------------------------------ |
                             改变 1 <-----+
                             犯罪
                             推
    -----------------------------------------
    PULL <-- Bob 的变化 +1 头
    MERGE <-- 尝试去除多余的头部
    RESOLVE CONFLICT <-- 解决合并冲突
    犯罪
    -----------------------------------------
                             改变 2 <-----+
                             COMMIT +-- 又一次合并
                             推 | 前面的冲突
    ------------------------------------------ |
    改变 2 <-----+
    犯罪
    PULL <-- Bob 的变化,再次 +1 头
    MERGE <-- 尝试去除多余的头部
    解决 ???

在这一点上,我的问题是:

  • 合并工具会考虑她的第一个合并决议吗?由于 Bob 从未提取 Alice 的更改,因此他的副本仍然没有 Alice 所做的任何更改、她的初始更改(与 Bob 的冲突)、她的合并以及她的最新更改(与 Bob 的最新更改冲突) .

如果我只是将 Bob 的文件版本和 Alice 的文件版本提供给任何合并程序,它会将这两个更改标记为冲突。

换句话说,冲突工具会尝试要求 Alice 解决原始冲突和新冲突,还是只解决最新的冲突?

我猜(我还没有尝试过,仍在尝试构建某种测试脚本来测试这个问题)Mercurial 只会要求 Alice 解决最新的冲突。

如果我将 Mercurial 配置为使用第 3 方差异/合并程序会怎样?这仍然适用吗?例如,我已将我的安装配置为使用Beyond Compare,是否会在有或没有初始分辨率的情况下给出这两个文件(Bob 的只有他的更改,而 Alice 的只有他的更改 + 合并分辨率)?换句话说,如果使用Beyond Compare,这里也会发生正确的事情(假设它确实发生了。)

4

2 回答 2

5

Mercurial 只需要解决最新的冲突,并且可以与外部更改工具一起正常工作。

当 Alice 进行第二次合并时,她正在将自己之前的合并与 bob 的新 delta 合并,并且只需要重新集成该更改。

非常清晰的图表,顺便说一句。谢谢

于 2010-10-25T16:24:30.200 回答
2

它只会要求 Alice 更改最新的冲突。

原因如下:

她已经从 BOB 获得了 CHANGE 1,它在她的历史记录中,因此它不会再次尝试更改该代码。有用。

于 2010-10-25T16:27:48.200 回答