98

最近有几个关于在 Mercurial 中维护发布分支时跳过更改的问题。例如:

由于它是在 2.0 中引入的,我一直想知道如何使用它graft来避免这个问题。给定这样的修订树:

A---B---C---D---E---F---G---H---I---J

假设我们需要创建一个跳过 Evil 更改的发布分支E

hg update -r D
hg graft "F::J"

给我们:

A---B---C---D---E---F---G---H---I---J
             \
              --F'--G'--H'--I'--J'
  • Q1:这里发生了什么?我可以理解,transplant会从 生成补丁F::J,然后将它们应用到D,但graft据说使用 3 路合并而不是补丁。所以.......这是如何工作的?为什么更好?

假设我现在修复E,并将其合并到我的发布分支中。

                  --E2-----------------
                 /                     \
A---B---C---D---E---F---G---H---I---J---M1
             \                            \
              --F'--G'--H'--I'--J'---------M2--

M1是直接合并;那里没什么特别的。M2 正在合并具有“相同”(或至少等效)更改的分支。

  • Q2:这种合并只是使用D,J'和的普通 3 路合并M1吗?
  • Q3:mercurial 是否存储/使用了有关移植操作的额外信息来帮助它进行合并?

最后...

  • Q4:这样的流程有哪些潜在问题?
4

2 回答 2

119

当您更新D和嫁接F::J时,Mercurial 会运行许多合并。它将从此合并开始:

M = three_way_merge(local=D, other=F, base=E)

如果我们写状态和+d之间的增量,那么我们从:CD

        +d     +e     +f
---- C ---- D ---- E ---- F ----

将图形顺时针旋转 90 度,上面的三路合并如下所示:

    -e  
  .---- D
 /
E
 \
  '---- F
    +f

也就是说,我们假设我们从 开始E并应用了相反的-eto get to D。我认为是+e. 从我们开始,E我们也进入F了正常的 delta状态+f。这里没有什么奇怪的——我们已经在存储库中拥有了所有的状态(DEF)。如此看来,很明显我们可以合并DF

合并是“完成钻石”的问题。所以我们找到了一个新的状态M,它是 和 的混合,D并且FDto的差异M类似于+f并且从Fto的差异M类似于-e。它看起来像这样:

    -e     +f'
  .---- D ----.
 /             \
E               M
 \             /
  '---- F ----'
    +f     -e'

+f三角洲变成+f'了,三角洲-e变成了-e'F这只是一个普通的三向合并,但效果很有趣:我们应用了 !D而不是E!

M合并后, to的第二个父级F被删除:

    -e     +f'
  .---- D ----.
 /             \
E               M
 \
  '---- F
    +f

重申一下:我们已经复制了 on 的“效果” ,也就是说,我们找到了一个 delta ( ),它应用到F的效果与应用到时的效果相同。我们可以把图拉直一点,得到:D+f'D+fE

       +f'
--- D ---- M
     \
      '---- E ---- F
        +e     +f

结果就是使用全三通机械F嫁接在上面。D

  • Q1:这里发生了什么?所以.......这是如何工作的?为什么更好?

    A1:使用合并比补丁更好,因为合并机制考虑了重命名之类的事情。

  • Q2:这个合并只是使用 D、J' 和 M1 的普通 3 路合并吗?

    A2:是的,嫁接不会改变图的拓扑结构。

  • Q3: mercurial 是否存储/使用了有关移植操作的额外信息来帮助它进行合并?

    A3:没有。

  • Q4:这样的流程有哪些潜在问题?

    A4:从合并的角度来看,它应该可以正常工作。它将复制一些可能使人们感到困惑的历史。

于 2012-03-07T16:24:43.000 回答
6

Q1:当有冲突时它会有所帮助。然后,您可以使用常用的合并工具(对我来说,它是内联冲突标记,我使用 Emacs 的 smerge-mode 进行编辑)。

Q2:这是一个正常的合并。

Q3:没有。

Q4:我认为有两个几乎相同的分支很难看。

于 2012-03-07T10:49:57.317 回答