在Mercurial中使用移植物的后果

Pau*_*l S 98 version-control mercurial branch dvcs cherry-pick

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

自从它在2.0中引入以来,我一直想知道如何graft避免这个问题.给定这样的修订树:

A---B---C---D---E---F---G---H---I---J
Run Code Online (Sandbox Code Playgroud)

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

hg update -r D
hg graft "F::J"
Run Code Online (Sandbox Code Playgroud)

给我们:

A---B---C---D---E---F---G---H---I---J
             \
              --F'--G'--H'--I'--J'
Run Code Online (Sandbox Code Playgroud)
  • 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--
Run Code Online (Sandbox Code Playgroud)

M1是直接合并; 没什么特别的.M2正在合并具有"相同"(或至少等同)变化的分支.

  • Q2:这个合并只是一个正常的3路合并使用D,J'M1
  • 问题3:mercurial存储/使用有关移植操作的额外信息以帮助它合并吗?

最后......

  • 问题4:像这样的流程存在哪些潜在问题?

Mar*_*ler 119

当您更新D并移植时F::J,Mercurial会运行许多合并.它将从这个合并开始:

M = three_way_merge(local=D, other=F, base=E)
Run Code Online (Sandbox Code Playgroud)

如果我们写+d的状态之间的增量CD,然后我们开始:

        +d     +e     +f
---- C ---- D ---- E ---- F ----
Run Code Online (Sandbox Code Playgroud)

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

    -e  
  .---- D
 /
E
 \
  '---- F
    +f
Run Code Online (Sandbox Code Playgroud)

也就是说,我们假装我们开始E并应用相反的方法-e来实现D.我认为是反向补丁+e.从E我们开始,我们也进入F了正态三角洲+f.没有什么奇怪的在这里-我们拥有所有的状态(D,E,和F)资源库中已.所以看到这样,很明显我们可以合并DF.

合并是"完成钻石"的问题.因此,我们找到新的状态M即是一个组合D,并F和其中从差DM类似于+f从差FM类似-e.它看起来像这样:

    -e     +f'
  .---- D ----.
 /             \
E               M
 \             /
  '---- F ----'
    +f     -e'
Run Code Online (Sandbox Code Playgroud)

+f三角洲成为+f'-e三角洲成了-e'.这仅仅是一个正常的三方合并,但效果很有趣:已应用FD替代的E!

合并后,将删除Mto 的第二个父项F:

    -e     +f'
  .---- D ----.
 /             \
E               M
 \
  '---- F
    +f
Run Code Online (Sandbox Code Playgroud)

要重申:我们已经复制的"效果" FD,也就是,我们已经找到了增量(+f'),其适用于D当得到同样的效应+f应用于E.我们可以稍微理顺图表来得到:

       +f'
--- D ---- M
     \
      '---- E ---- F
        +e     +f
Run Code Online (Sandbox Code Playgroud)

结果是F嫁接到D使用完整的三向机械.

  • Q1:这里发生了什么?那么......这是怎么回事?为什么更好?

    A1:使用合并比补丁更好,因为合并机器会考虑重命名等内容.

  • Q2:这个合并只是使用D,J'和M1的正常3向合并吗?

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

  • 问题3: mercurial存储/使用有关移植操作的额外信息以帮助它合并吗?

    A3:没有.

  • 问题4:像这样的流程存在哪些潜在问题?

    A4:从合并的角度来看,它应该可行.它将复制一些可能让人困惑的历史.

  • 很棒的问题,很棒的答案:).两个都+1! (4认同)
  • @PaulS:我认为你需要知道的是,移植可以以比移植更强大的方式复制变更集.在处理重命名的意义上是强大的,并且您可以在合并工具中解决冲突.细节是在它的奇怪合并中,但希望对日常使用移植物的理解不是必不可少的!:-) (3认同)
  • 不,但我是一个试图理解我不需要的东西的傻瓜;-)我通过一个更一般的例子使用你的一个作为基础. (3认同)

Rin*_*ing 6

Q1:有冲突时会有所帮助.您可以使用通常的合并工具(对我而言,它是内联冲突标记,我使用Emacs的smerge模式编辑).

Q2:这是正常的合并.

Q3:没有.

问题4:我认为拥有两个几乎相同的分支是很难看的.