如何只合并一些文件?

Bar*_*uch 4 merge mercurial tortoisehg

我试图将提交的一部分从默认分支(不是所有文件和其他文件的一部分)合并到命名分支。我试过了graft,但是整个提交都没有给我选择的机会。怎么做?

例:

A---B---C---D
      \
       -E---(G)
Run Code Online (Sandbox Code Playgroud)

G还不存在。可以说CD每个添加了5个文件,修改了5个文件。我想G在添加5个文件中的2个,C对其中一个文件进行所有修改,并对另一个文件进行一个修改。我理想地希望它也有类似的东西D

选择时graft to local...,我得到的只是整个C变更集。相同的merge with local...

ale*_*xis 5

合并的单位是一个整体变更集,因此C和D应该以较小的部分提交。您现在可以合并整个文件并还原一些文件,但这将导致您以后无法合并其余文件,因为它们已经被视为已合并。

我要做的是建立一个与CD平行的分支,在您的示例中植根于B,其中包含C和D的更改的副本,但将它们拆分为相关的部分。然后,您可以从中合并整个变更集,然后关闭(或什至删除)原始CD分支。

      C---D
     / 
A---B--C1--D1--C2--D2    (equivalent to C--D)
     \   
      E---(G?)
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,C1和C2等效于C。在我这样做的同时,我又对四个新的变更集进行了重新排序(使用诸如的历史记录重写工具rebase),因此您可以简单地将D1与E合并:

      C---D
     / 
A---B--C1--D1--C2--D2
     \      \
      E------G
Run Code Online (Sandbox Code Playgroud)

如果不能对新变更集进行重新排序,则必须进行一些花哨的舞曲来按C1,D1,C2,D2的顺序提交部分变更集;使用graft(或transplant)复制不允许单独合并的更改可能会少很多麻烦。例如,在下面,您仍然可以合并C1,但是您需要D1的副本(标记为D1'),因为如果不将C2与C2一起拉就无法合并。

      C---D
     / 
A---B--C1--C2--D1--D2
     \  \
      E--G1--D1'
Run Code Online (Sandbox Code Playgroud)