如何将合并变更集移植到Mercurial

如何将合并变更集移植到Mercurial,mercurial,merge,Mercurial,Merge,我想移植一个合并变更集: $ hg graft -UD --log -r 1909 skipping ungraftable merge revision 1909 我的解决办法是: hg export -r 1909 | hg import - hg commit -m"$(hg log -r 1909 --template 'grafted {node}')" 是否有不支持移植合并变更集的原因?合并变更集有两个父项,因此有两种不同的方式来查看所更改的内容。默认情况下,如果使用hg

我想移植一个合并变更集:

$ hg graft -UD --log -r 1909
skipping ungraftable merge revision 1909
我的解决办法是:

 hg export -r 1909 | hg import - 
 hg commit -m"$(hg log -r 1909 --template 'grafted {node}')"

是否有不支持移植合并变更集的原因?

合并变更集有两个父项,因此有两种不同的方式来查看所更改的内容。默认情况下,如果使用
hg diff-c
,它将显示与第一个父级(通常在合并时表示工作目录)相比的差异。如果这个假设是错误的,那么引入错误是很容易的

这就引出了一个问题:为什么要移植合并变更集而不是原始变更集本身。如果要移植一系列更改集,并且使用合并更改集“汇总”该系列,则可以一次移植原始多个更改:
hg graft“1000::1005”

就我个人而言,我通常使用
hg-rebase
执行此类任务,但这需要在hgrc或mercurial.ini中启用rebase扩展:

[extensions]
rebase=
以命令开头的
hg
有一个
--base
选项,可用于此目的。
其用法解释如下:

--base可用于指定第一个和唯一父级以外的另一个祖先

 

因此,通过将一个合并父级指定为基,可以将合并的结果作为单个提交进行后端口

对于您的示例,如果要移植相对于父版本1908的更改,可以使用以下命令:

hg graft -r 1909 --base 1908

其动机是移植合并变更集比合并移植单个变更集更容易。也有从第二个分支移植单个变更集不明显的情况。在我的情况下,rebase不适用。变更集已公开。我有一个合并,其中存在难以解决的合并冲突。我想知道如何移植该合并更改集,因为该解决方案将对较旧的p1()有效,而不是重做合并冲突解决方案的工作,但听起来这似乎不是一个选项。另一个解决方案是在合并前进行修订,将所有文件恢复到合并后的状态,然后提交(可能在一个单独的分支中;当然,您也可以将原始修订合并到此分支中,以确保这不会导致任何更改),然后移植生成的提交。