如何只合并一些文件?

时间:2013-06-11 21:28:59

标签: merge mercurial tortoisehg

我正在尝试将默认分支(不是所有文件和其他文件的部分)的部分提交合并到命名分支。我试过graft,但它只是让整个提交给我一个机会选择。怎么会这样做?

示例:

A---B---C---D
      \
       -E---(G)

G尚不存在。让我们说CD每个添加5个文件并修改5个文件。我希望GC添加5个文件中的2个,对其中一个文件进行所有修改,对另一个文件进行一次修改。理想情况下我也喜欢D

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

也是如此

1 个答案:

答案 0 :(得分:4)

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

我要做的是制作一个与C-D平行的分支,在你的例子中以B为根,它包含C和D中变化的副本,但是将它们分成连贯的部分。然后,您可以合并整个变更集,并关闭(或甚至删除)原始C-D分支。

      C---D
     / 
A---B--C1--D1--C2--D2    (equivalent to C--D)
     \   
      E---(G?)

在上面,C1和C2一起相当于C.当我在它时,我继续重新排序了四个新的变更集(使用历史重写工具,如rebase),这样你就可以然后简单地将D1与E合并:

      C---D
     / 
A---B--C1--D1--C2--D2
     \      \
      E------G

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

      C---D
     / 
A---B--C1--C2--D1--D2
     \  \
      E--G1--D1'