Mercurial移动更改为新分支

时间:2011-01-12 05:11:58

标签: mercurial branch

我已经对我的本地存储库进行了一些更改,但尚未推送。由于功能上的时间比预期的要长,我想在推送之前将这些更改交换到命名分支。我怎么能这样做?

4 个答案:

答案 0 :(得分:149)

根据Mark的建议, MqExtension 是您解决问题的唯一方法。恕我直言,更简单的工作流程是使用rebase extension。假设你有这样的历史记录:

@  changeset:   2:81b92083cb1d
|  tag:         tip
|  summary:     my new feature: edit file a
|
o  changeset:   1:8bdc4508ac7b
|  summary:     my new feature: add file b
|
o  changeset:   0:d554afd54164
   summary:     initial

这意味着,修订版0是您开始处理功能的基础。现在,您希望对命名分支进行修订1-2,假设为my-feature。更新到修订版0并创建该分支:

$ hg up 0
$ hg branch my-feature
$ hg ci -m "start new branch my-feature"

历史现在看起来像这样:

@  changeset:   3:b5939750b911
|  branch:      my-feature
|  tag:         tip
|  parent:      0:d554afd54164
|  summary:     start new branch my-feature
|
| o  changeset:   2:81b92083cb1d
| |  summary:     my new feature: edit file a
| |
| o  changeset:   1:8bdc4508ac7b
|/   summary:     my new feature: add file b
|
o  changeset:   0:d554afd54164
   summary:     initial

使用rebase命令将修订版1-2移至修订版3

$ hg rebase -s 1 -d 3

这导致以下图表:

@  changeset:   3:88a90f9bbde7
|  branch:      my-feature
|  tag:         tip
|  summary:     my new feature: edit file a
|
o  changeset:   2:38f5adf2cf4b
|  branch:      my-feature
|  summary:     my new feature: add file b
|
o  changeset:   1:b5939750b911
|  branch:      my-feature
|  summary:     start new branch my-feature
|
o  changeset:   0:d554afd54164
   summary:     initial

就是这样......正如Mark对答案的评论所提到的那样,移动已经推动的变更集通常是一个坏主意,除非你在一个小团队中工作,在那里你能够沟通和执行你的历史操作。

答案 1 :(得分:30)

您可以使用MqExtension。让我们说要移动的变更集是修订版1-3:

hg qimport -r 1:3    # convert revisions to patches
hg qpop -a           # remove all them from history
hg branch new        # start a new branch
hg qpush -a          # push them all back into history
hg qfin -a           # finalize the patches

答案 2 :(得分:9)

我更喜欢Mark Tolonen的补丁解决方案描述here

我有什么:

hg log -G

#default branch
@  changeset:   3:cb292fcdbde1
|
o  changeset:   2:e746dceba503
|
o  changeset:   1:2d50c7ab6b8f
|
o  changeset:   0:c22be856358b

我想要的是什么:

  @  changeset:   3:0e85ae268e35
  |  branch:      feature/my_feature
  |
  o  changeset:   2:1450cb9ec349
  |  branch:      feature/my_feature
  |
  o  changeset:   1:7b9836f25f28
  |  branch:      feature/my_feature
  |
 /
|
o  changeset:   0:c22be856358b

mercurials命令:

hg export -o feature.diff 1 2 3
hg update 0
hg branch feature/my_feature
hg import feature.diff

这是我本地存储库的状态

@  changeset:   6:0e85ae268e35
|  branch:      feature/my_feature
|
o  changeset:   5:1450cb9ec349
|  branch:      feature/my_feature
|
o  changeset:   4:7b9836f25f28
|  branch:      feature/my_feature
|
| o  changeset:   3:cb292fcdbde1
| |
| o  changeset:   2:e746dceba503
| |
| o  changeset:   1:2d50c7ab6b8f
|/
|
o  changeset:   0:c22be856358b

现在我需要从默认分支中删除修订版1 2和3。 您可以使用mq扩展名中的strip命令执行此操作。 hg strip从存储库中删除变更集及其所有后代。

通过在配置文件(.hgrc或Mercurial.ini)中添加以下行来启用扩展程序:

vim ~/.hgrc并添加:

[extensions]
mq =

现在在修订版1上删除此存储库。

hg strip 1

我们在这里

@  changeset:   3:0e85ae268e35
|  branch:      feature/my_feature
|
o  changeset:   2:1450cb9ec349
|  branch:      feature/my_feature
|
o  changeset:   1:7b9836f25f28
|  branch:      feature/my_feature
|
o  changeset:   0:c22be856358b

注意:变更集不同,但修订版本相同

答案 3 :(得分:5)

对于那些倾向于使用GUI的人

  1. 转到Tortoise Hg - > File - > Settings然后勾选rebase
  2. enter image description here

    1. 重启tortoise UI

    2. 创建新分支,您将在其中移动更改。点击当前分支名称 - >选择Open a new named branch - >选择分支名称。

    3. enter image description here

      1. 如果您想要移动的更改尚未public(例如draft),请转到5.(如果已发布更改但您不是高级开发人员,则应与高级人员交谈(得到一个替罪羊),因为你可能搞砸了很长时间,我不承担任何责任:))。
      2. 转到View - > Show Console(或 Ctrl + L ) 然后写入控制台hg phase -f -d 2 - 其中2是最低版本,您将转移到新分支。

        1. 转到分支和修订版(如果要将更改移动到步骤3中创建的新分支,则应该是最高版本。)Right Mouse - > Update

        2. 转到分支和转播,您将从Right Mouse - >移动更改Modify History - > Rebase

        3. enter image description here

          1. 点击Rebase并祈祷没有冲突,如果必须,请合并。

          2. 推送更改,此时所有修订版仍应为draft

          3. 转到您正在将更改移至Right Mouse - >的分支中的最高版本Change Phase to - > Public

          4. enter image description here

            希望这可以节省你一些时间。