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
-  转到Tortoise Hg– >File– >Settings然后打勾rebase。
  
 
- 
重新启动乌龟UI 
- 
创build新的分支,您将移动更改。 点击当前分支名称 – >select Open a new named branch– >select分支名称。
  
 
-  如果你想要移动的变化没有public(例如draft),请转到5.(如果变更已经发布,而且你不是高级开发者,那么你应该跟某个高级人员(替罪羊)谈话,大的时候,我不承担任何责任:))。
 转到View – > Show Console (或Ctrl + L ),然后在控制台中写入hg phase -f -d 2 – 其中2是您要移动到新分支的最低版本。 
- 
转到分支和修订(如果要将更改移动到在步骤3中创build的新分支,应该是最上面的修订版本。) Right Mouse– >Update
- 
转到分支和revsion你将移动 Right Mouse– >Modify History– >Rebase
  
 
- 
点击 Rebase并祈祷没有冲突,如果你必须合并。
- 
推动变化,在这一点上所有的修改仍然应该是 draft。
- 
转到您正在将更改移至 Right Mouse– >Change Phase to– >Public最高版本。
  
 
希望这可以为你节省一些时间。