拆分 Mercurial 中的多个中间更改

Splitting out multiple intermediate changes in Mercurial

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

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

我想达到默认具有来自命名分支 2 的更改但 none 来自命名分支 1 的更改。我还想要一个具有来自命名分支 1 的更改的分支,当我们 return 到此功能。

我怀疑没有简单的方法可以做到这一点,并且历史记录中会有一些混乱的部分,但是我不知道如何开始这项任务。

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

hg graft 8 9 10

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

如果使用TortoiseHg、select变更集移植到当前selected变更集,然后右击selectGraft Selected to local...

结果:

由于要移动整个分支2,可以考虑使用rebase。克隆存储库并试试这个:

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

原则上这将把历史改写成它本来应该是的样子。然而:

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

  2. 既然rebase改写了历史,你就得让大家合作同步他们的仓库。在你的情况下这是否可行或值得麻烦我不能说,但这并不难:假设每个人都在分支 2 中推送了任何更改,他们可以提取新的历史记录,然后摆脱分支 2 的过时版本hg strip:

    hg strip <first branch2 rev>