首页 > 解决方案 > 将过去的反复提交移至不同的分支

问题描述

1 -- 2 -- 3 --------- 7     C
 \         \- 4      /      B
  \------------5----/       A

我最终在我的 mercurial 存储库中得到了上面的分支结构。我真正想要的是提交 2 和 3 在分支 B 上,如下所示:

1 -- 2 -- 3 -- 4  B
 \ ------------5  A

有没有一种很好的方法可以追溯获得这种结构?

标签: mercurial

解决方案


我会有点不同意DaveInCaz 的回答,但最后,同意结论:你应该能够忍受你所拥有的;没关系。

从技术上讲,在 Mercurial 中,一旦提交,它就在一个分支上,而它所在的分支就是提交时所在的一个分支。因此,如果您在分支上C并提交了 2 和 3,那么提交 2 和 3 就在 branch 上C,现在和永远。

但这对于完成工作并不重要。提交 4 在分支上B,提交 4 的父级是 commit 3,其父级是 commit 2。他们在其他分支上的事实通常并不重要。

(此设置与 Git 完全不同:在 Git 中,提交位于可以访问其提示的所有分支上。可以随时创建和销毁分支提示名称,指向任何现有的提交。这意味着分支集合某个提交是在一天到另一天的更改。实际上,Git 中的分支名称没有任何内在含义。您可以随时添加、删除或更改任何名称。提交不会更改,但分支集到达他们的名字。)

如果出于某种原因——例如,某些外部工具要求提交的分支名称B而不是C——你确实想要或需要移动这些提交,答案是你实际上根本不能移动它们,但是你可以 复制它们:

C: 1 -- 2 -- 3 --------- 7
B:  \         \- 4      /
A:   \------------5----/

可以变成:

C: 1 -- 2 -- 3 ------------------ 7
   |\         \                  /
 B | \         4                /
B: |  \                        /
 B |   -------- 2b - 3b - 4b  /
    \                        /
A:   ---------------------- 5

请注意,复制22b3到 后3b,您现在还必须复制44b。两者44b在分支上B,分支B现在有两个头。

正如 DaveInCaz 所指出的,您可以删除不需要的提交。如果它们存在于您与之交谈的其他克隆中,那么每次您与该克隆交谈时它们都会回来,除非您也将它们剥离在那里


推荐阅读