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)不包括删除和重新创建。可惜的是,这段历史将要消失。