Mercurial搬迁到新分支


Answers:


153

正如Mark所建议的那样,MqExtension是您解决问题的一种解决方案。恕我直言,一个更简单的工作流程是使用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是您开始使用功能的基础。现在,您要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 2012年

9
@sschuberth:我认为露骨是一件好事。如果多余的变更集对您来说是个问题,请将其与后续变更集结合使用(例如,使用fold现在内置的histedit扩展程序的命令)。
Oben Sonne 2012年

6
@AmirRachum:hg log -GGraphlogExtension)。我已经手动删除了一些行,但是它也可以使用自定义日志样式完全自动呈现。
Oben Sonne 2012年


1
@sschuberth我同意。我的解决方法是使用--keepbranches标志将您的非虚拟提交重新建立到虚拟提交的父目录上,然后hg剥离您的虚拟提交。更改分支名称需要做很多工作,但有时Mercurial会像这样愚蠢。
weberc2 2015年

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

我想导入63:64和66:68。我得到的修订版65不是64的父级
Casebash 2011年

您想对65岁做什么?Mq只能从头部转换连续的变更集。它将通常不变的变更集转换为可以编辑的可变补丁。这会更改哈希值(影响所有子级),因此您不能跳过。
Mark Tolonen 2011年

我在主分支上进行了一些更改(包括65),并进行了推送
Casebash 2011年

1
不要编辑已推送的变更集。Mq更改了哈希,因此它们将有效地成为新的变更集。仅编辑尚未推送的历史记录。
Mark Tolonen 2011年

如果您已经推过65,那么您绝对不应该移动63和64,而只是适应移动66:68(同样,仅当您未推动它们时)。
马特

9

我更喜欢Mark Tolonen 在此处描述的补丁解决方案

我有的:

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

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

在此处输入图片说明

  1. 重新启动乌龟界面

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

在此处输入图片说明

  1. 如果尚未进行更改public(例如draft),请转到5。(如果更改已经发布并且您不是高级开发人员,则应与高级人员交谈(获得替罪羊),因为这可能会使您忙得不可开交,我不承担任何责任:))。

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

  1. 转到分支和修订版(如果将更改移至步骤3中创建的新分支,则应为最高修订版。)Right Mouse->Update

  2. 转到分支和修订版本,您将从Right Mouse-> Modify History-> 移动更改Rebase

在此处输入图片说明

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

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

  3. 转到将更改移动到Right Mouse-> Change Phase to->的分支的最高修订版Public

在此处输入图片说明

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


很好!要尝试这个问题,不过只是一个问题-为什么最后将阶段改为公开?“在远程存储库中看到的所有变更集都是公开的”,因此当您推送时,它是否仍不会设为公开?
约书亚·

@JoshLeeDucks推送时,它们public不再自动更改(至少对我而言,它们不更改)。
Matas Vaitkevicius
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.