2

我的存储库的历史如下所示:

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

这两个分支都是“运输”分支,本质上是不同的前端到一个共同的后端。

所有代码过去都在一个分支中,通过编译器开关打开或关闭foo或功能,但我进行了分支以便更容易单独处理每个代码。bar

问题是,常见的“后端”文件本身可能应该是一个单独的分支——我经常只想处理那些常见的文件。由于我创建这些分支的方式,历史有点搞砸了:在 branchbar的过去,它曾经具有来自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 回答 2

1

foo分支上有多少变更集bar?后端(移植的)变更集是否与前端变更集分开?

如果变更集不多,而且很干净,那么您可能需要这样做:

       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 与 bar 相关。)

— 即,基于 and 的最新共同祖先创建您的分支,backend然后将所有与后端相关的变更集移植到那里。从此时起,您将能够合并到任一分支。foobarbackend

于 2012-05-18T21:03:29.097 回答
0

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

  1. 我关闭了bar分支。

  2. 我将原始存储库克隆到一个新存储库backend中。

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

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

  5. 我将backend存储库克隆到一个新的存储库bar中。

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

这保留了我的历史foo,并失去了历史的连续性bar(尽管所有的历史仍然存在,如果我需要的话);现在两者foobar都是对存储库进行修改的克隆,backend这正是我想要的。

于 2012-05-27T23:43:04.677 回答