在Mercurial

时间:2015-05-29 16:32:27

标签: mercurial branching-and-merging

我们有一个非常不幸的情况,其中一个新的功能分支来自第二个不相关的功能分支,该分支已被搁置而非默认。两个功能分支中都有多个变更集,而大多数更改的文件与几个在两个分支上都进行了编辑的高级项目文件无关。 Default也在此期间进行了多次更新和合并。值得庆幸的是,中间功能尚未与新功能同时更新。我已经查看了各种可用的命令和选项,并且失去了如何最好地解决这种情况。树目前看起来大致如下:

Default -- Various edits and merges -- tip
   \
    \-- Named Branch 1 (15 changes) -- Named Branch 2 (30 edits)

我想要达到默认值来自命名分支2的更改,但没有来自命名分支1的更改。我还想要一个在返回此功能时可以使用命名分支1的更改的分支。

我怀疑没有简单的方法可以做到这一点,并且历史上会出现一些混乱的部分,但是我对如何开始执行这项任务感到茫然。 / p>

2 个答案:

答案 0 :(得分:1)

hg graft可以挑选从一个分支到另一个分支的变更集。更新到目标分支,然后通过运行来删除要复制的修订,例如:

hg graft 8 9 10

将使用正常的合并过程处理冲突。

如果您使用TortoiseHg,请选择要移植到当前所选变更集的更改集,然后右键单击并选择Graft Selected to local...

enter image description here

结果:

enter image description here

答案 1 :(得分:1)

由于您想要移动整个分支2 ,您可以考虑使用rebase。复制存储库并尝试:

hg rebase --source <first branch2 rev> --dest <new parent in default> --keepbranches

这原则上将历史转变为应有的历史。但是:

  1. 您可能必须解决<first branch2 ver>移动到新父级时出现的冲突。

  2. 由于rebase重写了历史记录,因此您必须让每个人都合作同步他们的存储库。在你的情况下,这是否可行或值得麻烦我不能说,但并不是那么困难:假设每个人都推动了分支2的任何变化,他们可以拉出新的历史,然后摆脱过时版本的分支2 hg strip

    hg strip <first branch2 rev>