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)
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正在合并具有"相同"(或至少等同)变化的分支.
D,J'和M1?最后......
Mar*_*ler 119
当您更新D并移植时F::J,Mercurial会运行许多合并.它将从这个合并开始:
M = three_way_merge(local=D, other=F, base=E)
Run Code Online (Sandbox Code Playgroud)
如果我们写+d的状态之间的增量C和D,然后我们开始:
+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)资源库中已.所以看到这样,很明显我们可以合并D和F.
合并是"完成钻石"的问题.因此,我们找到新的状态M即是一个组合D,并F和其中从差D到M类似于+f从差F到M类似-e.它看起来像这样:
-e +f'
.---- D ----.
/ \
E M
\ /
'---- F ----'
+f -e'
Run Code Online (Sandbox Code Playgroud)
该+f三角洲成为+f'和-e三角洲成了-e'.这仅仅是一个正常的三方合并,但效果很有趣:已应用F到D替代的E!
合并后,将删除Mto 的第二个父项F:
-e +f'
.---- D ----.
/ \
E M
\
'---- F
+f
Run Code Online (Sandbox Code Playgroud)
要重申:我们已经复制的"效果" F上D,也就是,我们已经找到了增量(+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:从合并的角度来看,它应该可行.它将复制一些可能让人困惑的历史.
Q1:有冲突时会有所帮助.您可以使用通常的合并工具(对我而言,它是内联冲突标记,我使用Emacs的smerge模式编辑).
Q2:这是正常的合并.
Q3:没有.
问题4:我认为拥有两个几乎相同的分支是很难看的.