2011-01-12 55 views
117

我对本地存储库提交了一些更改,但尚未推送。由于某个功能的使用时间比预期的要长,因此我希望在推送之前将这些更改交换到命名的分支上。我怎样才能做到这一点?Mercurial将更改移至新分支

+2

可能的重复[如何将某些变更集移动到新的分支在mercurial](http://stackoverflow.com/questions/2219756/how-to-move-some-changeset-to-a-new-branch- in-mercurial) –

回答

147

至于建议的关口,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 

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

+4

恕我直言,这种解决方案的缺点是它引入了“启动新分支我的功能”哑提交(即不会更改任何文件)。 – sschuberth

+7

@sschuberth:我认为在这里明确表达是件好事。如果额外的变更集对您来说是一个问题,请将其与后面的变更集结合使用(例如,通过使用现在内置的[histedit](http://mercurial.selenic.com/wiki/HisteditExtension)扩展名的'fold'命令)。 –

+0

如何用ASCII树打印日志? –

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 
+0

我想导入63:64和66:68。我正在修订65是不是64的父母 – Casebash

+0

你想用65做什么? Mq只能从头部转换连续的变更集。它通常将不可变的变更集变成可编辑的可变补丁。这改变了哈希(影响所有孩子),所以你不能跳过。 –

+0

我在主分支上进行了多项更改(包括65),并推送 – Casebash

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 

汞命令:

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 

注:更改集不同但版本相同

5

对于那些倾向于使用GUI

  1. 转到Tortoise Hg - >File - >Settings然后剔rebase

enter image description here

  • 重启龟UI

  • 创建新的分支,你将被移动的变化。点击当前分行名称 - >选择Open a new named branch - >选择分行名称。

  • enter image description here

  • 如果没有做出要移动变化public(如draft)到5(如果改变已经公布和你不是高级开发人员,你应该与某个高级人员谈话(请准备替罪羊),因为你可能会把事情搞得一团糟,我不承担任何责任:))。
  • 转到View - >Show Console(或按Ctrl +大号) 然后在控制台hg phase -f -d 2写 - 其中2最低版本,你会被转移到新的分支。

  • 转到分支和修订(应该是最上面的修订如果要移动的变化在步骤3中创建新的分支)Right Mouse - >Update

  • 转到分支和revsion你会从Right Mouse被移动的变化 - >Modify History - >Rebase

  • enter image description here

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

  • 推送更改,此时所有修订仍应为draft

  • 转至您正在将分支移至Right MouseChange Phase toPublic的分支的最高修订版。

  • enter image description here

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

    +0

    太棒了!去试试这个,但只有一个问题 - 为什么在最后阶段将公共阶段改为公开? “在远程存储库中看到的任何变更集都是公开的”,所以当你推动它时,它不会被设置为公共吗? –

    +0

    @JoshLeeDucks推动时,他们不会再自动改变为“公共”(至少对我而言他们不会)。 –

    相关问题