Mercurial 移动更改为新分支

我已经向本地存储库提交了许多更改,但是还没有被推送。因为在一个特性上花费的时间比预期的要长,所以我希望在推送之前将这些更改交换到一个命名的分支上。我怎么能这么做?

35177 次浏览

You can use the Mq 扩展. Let's say the changesets to move are revisions 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

正如马克所建议的那样,Mq 扩展是解决你问题的一种方法。恕我直言,一个更简单的工作流程是使用 重定基扩展重定基扩展。假设你有这样一段历史:

@  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 的回答的评论中提到的那样,除非您在一个小团队中工作,在这个小团队中您可以交流并强制执行您的历史操作,否则移动已经被推动的变更集通常是一个坏主意。

我更喜欢 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

水银指令:

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

现在我需要从我的默认分支中删除修订本12和3。 You can do this with strip command from mq's extension. hg strip从存储库中删除变更集及其所有子集。

通过向配置文件(. hgrc 或 Mercurial.ini)添加以下代码行来启用扩展:

vim ~/.hgrc and add :

[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

注意: 变更集是不同的,但修订是相同的

对于那些倾向于使用图形用户界面

  1. Go to Tortoise Hg -> File -> Settings then tick rebase .

enter image description here

  1. 重新启动龟式用户界面

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

enter image description here

  1. 如果你想移动的变化没有被做 public(例如 draft)到5。(如果已经发布了变化,而你不是高级开发人员,你应该找高级开发人员谈谈(找个替罪羊) ,因为你可能会把事情搞砸,我不会承担任何责任:)。

转到 View-> Show Console(或 Ctrl + L) 然后写在控制台 hg phase -f -d 2-其中2是最低的修订,你将移动到新的分支。

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

  2. 转到分支和修订,你将从 Right Mouse移动变化-> Modify History-> Rebase

enter image description here

  1. 单击 Rebase并祈祷没有冲突,如果必要则合并。

  2. 推动改变,在这一点上所有的修订应该仍然是 draft

  3. Go to topmost revision in branch you were moving changes to Right Mouse -> Change Phase to -> Public.

enter image description here

希望这能为你节省点时间。