如何使用两个主要的并行分支重构mercurial存储库

时间:2012-05-18 18:39:09

标签: version-control mercurial branch

我的存储库的历史记录如下:

A -- B -- C (branch "foo")
      \
       -- D (branch "bar")

这两个分支都是“运输”分支,并且与共同的后端基本上是不同的前端。

所有代码都在一个分支中,foobar功能由编译器开关打开或关闭,但我分支以便更容易单独处理每个。< / p>

问题在于,常见的“后端”文件本身可能应该是一个单独的分支 - 而且我经常希望只是处理这些常见文件。由于我创建这些分支的方式,历史有点搞砸了:在分支bar的过去,它曾经有foo的功能。

目前,我只是在一个分支上进行更改,然后使用hg transplant将相同的更改复制到另一个分支。

相反,我希望能够以这种方式进行更改:

       __ C __ D'   (branch "foo")
      /      /
A -- B -- D         (branch "backend")
      \      \
       -- E -- D''  (branch "bar")

即,在分支backend上工作,然后在每个发货分支(foobar)中工作,我使用hg merge backend

从我目前的状况到我描述的那种情况,最好的方法是什么?我能想到的唯一方法是:

  1. 删除所有foobar功能,并将该分支命名为backend

  2. 删除旧的foobar分支。

  3. foo个功能手动添加到backend,并为该分支foo命名,同样为bar命名。

  4. 有更好的方法吗?

    另外,这是正确的做法吗?

2 个答案:

答案 0 :(得分:1)

分支机构foobar有多少变更集?后端(移植)变更集是否与前端变更集分开?

如果变更集不多,并且它们很干净,那么您可能希望这样做:

       C -- 1 -- 2 -- D -- 3   (branch "foo")
      /      
A -- B ----------- C" -- D"   (branch "backend")
      \      
       C' -- 4 ------ D' --- 5   (branch "bar")

(此处A,B,C,D与后端相关; 1,2,3与foo相关; 4,5与条形相关。)

- 即根据backendfoo的最新共同祖先创建您的bra bar,然后在那里移植所有与后端相关的变更集。从现在开始,您将能够将backend合并到任一分支中。

答案 1 :(得分:0)

我选择将其拆分为多个存储库而不是一个存储库中的多个分支,如下所示:

  1. 我关闭了bar分支。

  2. 我将原始存储库克隆到新的存储库backend

  3. 我删除了所有与foo相关的代码。

  4. 我将这些更改提取到主存储库中,然后立即退出它们(因此foo代码仍然存在)。这成了我的foo存储库。

  5. 我将backend存储库克隆到新存储库bar

  6. 我将现已关闭的bar分支中的所有文件复制并粘贴到bar存储库中。

  7. 这保留了foo的历史记录,并且遗失了历史记录bar的连续性(尽管所有的历史仍然存在,如果我需要的话);现在,foobar都是backend存储库的克隆,这些正是我想要的。