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

Version control 如何用两个主要的并行分支重构mercurial存储库,version-control,mercurial,branch,Version Control,Mercurial,Branch,我的存储库的历史记录如下所示: A -- B -- C (branch "foo") \ -- D (branch "bar") 这两个分支都是“运送”分支,并且本质上是一个公共后端的不同前端 所有代码过去都在一个分支中,通过编译器开关打开或关闭foo或bar功能,但我进行了分支,以使每个分支更易于单独使用 问题是,公共“后端”文件本身可能应该是一个单独的分支,我通常只想处理这些公共文件。由于我创建这些分支的方式,历史有点混乱:在分支bar的过去,它曾经拥有foo的功

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

A -- B -- C (branch "foo")
      \
       -- D (branch "bar")
这两个分支都是“运送”分支,并且本质上是一个公共后端的不同前端

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

问题是,公共“后端”文件本身可能应该是一个单独的分支,我通常只想处理这些公共文件。由于我创建这些分支的方式,历史有点混乱:在分支
bar
的过去,它曾经拥有
foo
的功能

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

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

       __ C __ D'   (branch "foo")
      /      /
A -- B -- D         (branch "backend")
      \      \
       -- E -- D''  (branch "bar")
也就是说,在分支
后端
,然后在每个装运分支(
foo
bar
)中,我使用
hg merge backend

从我目前的状况到我正在描述的状况,最好的方式是什么?我能想到的唯一办法是:

  • 删除所有
    foo
    bar
    功能,并命名该分支
    backend

  • 删除旧的
    foo
    bar
    分支

  • 手动将
    foo
    功能添加到
    backend
    中,并命名该分支
    foo
    ,对于
    bar
    也是如此

  • 有更好的办法吗


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

    分支
    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相关。)


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

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

  • 我关闭了
    分支

  • 我将原始存储库克隆到一个新的存储库
    后端

  • 我删除了所有与
    foo
    相关的代码

  • 我将这些更改拉入主存储库,然后立即退出(因此
    foo
    代码保留)。这成为了我的
    foo
    存储库

  • 我将
    后端
    存储库克隆到一个新的存储库

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


  • 这保留了我的
    foo
    历史记录,并失去了
    bar
    历史记录的连续性(尽管所有历史记录仍然存在,如果我需要的话);现在
    foo
    bar
    都是
    后端
    存储库的克隆,经过修改,这正是我想要的。

    不幸的是,它没有这么干净。两个分支上都有很多变更集。我认为主要的问题是,
    foo
    bar
    的最新共同祖先既有
    foo
    又有
    bar
    相关的东西。我想要一个新的分支,它只有
    后端
    功能;但是如果我从新的
    后端
    分支中删除所有
    foo
    bar
    内容,那么我将无法直接合并到任何一个分支中。@Jesseber:是的,删除可能会有问题。您可以在
    foo
    上删除除后端之外的所有内容,从那里分支
    backend
    ,然后返回
    foo
    并撤消删除。这样,下次您将
    后端
    合并到
    foo
    中时,删除操作将已经存在。不过,这并没有考虑到
    bar
    。@Jesseber:还有其他方法:1)如果后端位于一个单独的目录下,您可能可以使用
    hg convert
    仅过滤出此目录的历史记录,然后
    hg pull--force
    作为
    后端
    分支进入原始目录,或者2)如果您不关心历史记录,只需将后端的最新状态复制到新的
    后端
    分支,然后从那里进行开发。哪个选项最适合您?不,很遗憾后端不在自己的目录中。我想这看起来好像没有什么好办法,所以我可能会忘记历史,试着重新开始。@JesseBeder:我还是喜欢我的选项(2)而不是你原来的计划,因为(2)不包括删除和重新创建。可惜的是,这段历史将要消失。