Mercurial将更改移至新分支

我有一些改变,我承诺我的本地存储库,但还没有推。 由于一个function比预期花费的时间更长,我想在推送之前将这些更改交换到一个命名的分支上。 我怎样才能做到这一点?

正如Markbuild议的那样, MqExtension是解决您问题的方法之一。 恕我直言,一个更简单的工作stream程是使用rebase扩展 。 假设你有这样的历史:

@ 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是您开始处理function的基础。 现在你想在命名分支上修改1-2 ,比如my-feature 。 更新到版本0并创build该分支:

 $ 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 

就是这样..正如马克的回答中所提到的,移动已经推动变更集合通常是一个坏主意,除非你在一个小团队中工作,你可以沟通和执行你的历史操纵。

您可以使用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 

我更喜欢Mark Tolonen 在这里描述的补丁解决scheme

我拥有的:

 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从版本库中删除变更集及其所有后代。

通过将以下行添加到configuration文件(.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 

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

对于那些倾向于使用GUI

  1. 转到Tortoise Hg – > File – > Settings然后打勾rebase

在这里输入图像说明

  1. 重新启动乌龟UI

  2. 创build新的分支,您将移动更改。 点击当前分支名称 – >selectOpen a new named branch – >select分支名称。

在这里输入图像说明

  1. 如果你想要移动的变化没有public (例如draft ),请转到5.(如果变更已经发布,而且你不是高级开发者,那么你应该跟某个高级人员(替罪羊)谈话,大的时候,我不承担任何责任:))。

转到View – > Show Console (或Ctrl + L ),然后在控制台中写入hg phase -f -d 2 – 其中2是您要移动到新分支的最低版本。

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

  2. 转到分支和revsion你将移动Right Mouse – > Modify History – > Rebase

在这里输入图像说明

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

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

  3. 转到您正在将更改移至Right Mouse – > Change Phase to – > Public最高版本。

在这里输入图像说明

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