Version control 汞中毒患者使用移植物的后果

Version control 汞中毒患者使用移植物的后果,version-control,mercurial,branch,dvcs,cherry-pick,Version Control,Mercurial,Branch,Dvcs,Cherry Pick,在Mercurial中维护发布分支时,最近有几个关于跳过更改的问题。例如: 自从它在2.0中引入以来,我一直想知道如何使用graft来避免这个问题。给定这样的修订树: A---B---C---D---E---F---G---H---I---J -e .---- D / E \ '---- F +f -e +f' .---- D ----. / \ E M \

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

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

A---B---C---D---E---F---G---H---I---J
    -e  
  .---- D
 /
E
 \
  '---- F
    +f
    -e     +f'
  .---- D ----.
 /             \
E               M
 \             /
  '---- F ----'
    +f     -e'
假设我们需要创建一个发布分支来跳过邪恶的更改
E

hg update -r D
hg graft "F::J"
给我们:

A---B---C---D---E---F---G---H---I---J
             \
              --F'--G'--H'--I'--J'
  • 刚才发生了什么?我可以理解,
    transplant
    会从
    F::J
    中生成补丁,然后将它们应用到
    D
    ,但据说
    graft
    使用的是三向合并而不是补丁。所以这是怎么回事?为什么更好
假设我现在修复了
E
,并将其合并到我的发布分支中

                  --E2-----------------
                 /                     \
A---B---C---D---E---F---G---H---I---J---M1
             \                            \
              --F'--G'--H'--I'--J'---------M2--
M1是一个直合并;没什么特别的。 M2是合并上具有“相同”(或至少等效)更改的分支

  • 问题2:此合并是否只是使用
    D
    J'
    M1
    的普通三方合并
  • 问题3:mercurial是否存储/使用了有关移植手术的额外信息来帮助合并
最后

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

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

问题2:这是正常的合并

问题3:没有


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

当您更新到
D
和graft
F::J
时,Mercurial会运行许多合并。它将从以下合并开始:

M = three_way_merge(local=D, other=F, base=E)
如果我们为状态
C
d
之间的增量写
+d
,那么我们从以下开始:

        +d     +e     +f
---- C ---- D ---- E ---- F ----
将图表顺时针旋转90度,上述三向合并如下所示:

A---B---C---D---E---F---G---H---I---J
    -e  
  .---- D
 /
E
 \
  '---- F
    +f
    -e     +f'
  .---- D ----.
 /             \
E               M
 \             /
  '---- F ----'
    +f     -e'
也就是说,我们假设我们从
E
开始,然后应用
-E
的反方向来得到
D
。我认为这是
+e
的反面补丁。从
E
开始,我们还使用正常的delta
+F
进入状态
F
。这里没有什么奇怪的-我们已经在存储库中有了所有状态(
D
E
、和
F
)。这样看来,很明显我们可以合并
D
F

合并是一个“完成钻石”的问题。因此,我们发现了一种新的状态
M
,它是
D
F
的混合,其中
D
M
的区别类似于
+F
,而
F
M
的区别类似于
-e
。看起来是这样的:

A---B---C---D---E---F---G---H---I---J
    -e  
  .---- D
 /
E
 \
  '---- F
    +f
    -e     +f'
  .---- D ----.
 /             \
E               M
 \             /
  '---- F ----'
    +f     -e'
+f
增量变为
+f'
-e
增量变为
-e'
。这只是一个普通的三方合并,但效果很有趣:我们将
F
应用到
D
而不是
E

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

    -e     +f'
  .---- D ----.
 /             \
E               M
 \
  '---- F
    +f
重申:我们已将
F
的“效果”复制到
D
,也就是说,我们发现应用于
D
的增量(
+F'
)与应用于
E
的效果相同。我们可以将图表拉直一点,得到:

       +f'
--- D ---- M
     \
      '---- E ---- F
        +e     +f
结果是使用全三向机械将
F
嫁接到
D

  • Q1:刚才发生了什么?所以这是怎么回事?为什么更好

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

  • Q2:此合并是否只是使用D、J'和M1的普通三方合并

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

  • Q3:mercurial是否存储/使用了有关移植手术的额外信息来帮助合并

    A3:

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

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


好问题,好答案:)+一对一!谢谢你,马丁。不管是谁想出的这个想法都很古怪。我有这个想法,但需要解决一般情况。我猜不管你移植到/从哪个节点之间的路径,它都是成立的?@PaulS:我想你需要知道的是,移植可以比移植更可靠地复制变更集。在处理重命名以及您可以在合并工具中解决冲突的意义上,此功能非常强大。细节在它所做的奇怪的合并中,但希望这不是日常使用嫁接所必须了解的!:-)不,但我很容易理解我不需要理解的东西;-)我用你的例子做了一个更一般的例子。@PaulS如果是的话,那么我几乎不敢向你提及这个。。。但是你可以查一下它的补丁理论。上面关于将图形旋转90度的技巧让我想起了很多关于合并时交换补丁的内容。漂亮的毛茸茸的东西:-)