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
最高版本。
希望这可以为你节省一些时间。