Mercurial移动更改为新分支

Cas*_*ash 123 mercurial branch

我对本地存储库进行了许多更改,但尚未推送.由于功能上的时间比预期的要长,我想在推送之前将这些更改交换到命名分支.我怎样才能做到这一点?

Obe*_*nne 152

正如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
Run Code Online (Sandbox Code Playgroud)

这意味着,修订0是您开始处理功能的基础.现在,您想要对1-2命名分支进行修订,比如说my-feature.更新到修订0并创建该分支:

$ hg up 0
$ hg branch my-feature
$ hg ci -m "start new branch my-feature"
Run Code Online (Sandbox Code Playgroud)

历史现在看起来像这样:

@  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
Run Code Online (Sandbox Code Playgroud)

使用该rebase命令将修订移动1-2到修订版3:

$ hg rebase -s 1 -d 3
Run Code Online (Sandbox Code Playgroud)

这导致以下图表:

@  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
Run Code Online (Sandbox Code Playgroud)

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

  • @sschuberth:我认为明确是一件好事.如果额外的变更集对你来说是个问题,可以将它与后续变更集合起来(例如使用现在内置的[histedit](http://mercurial.selenic.com/wiki/HisteditExtension)扩展名的`fold`命令). (9认同)
  • @AmirRachum:`hg log -G`([GraphlogExtension](http://mercurial.selenic.com/wiki/GraphlogExtension)).我手动剥离了一些线条,但它也可以使用[自定义日志样式]完全自动渲染(http://hgbook.red-bean.com/read/customizing-the-output-of-mercurial.html #id417618). (6认同)
  • 恕我直言,这个解决方案的缺点是它引入了一个"启动新分支my-feature"虚拟提交(即一个不改变任何文件). (4认同)
  • 启用* rebase *扩展名:http://mercurial.selenic.com/wiki/RebaseExtension#Configuration (2认同)

Mar*_*nen 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
Run Code Online (Sandbox Code Playgroud)


Gui*_*ent 9

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

是)我有的:

hg log -G

#default branch
@  changeset:   3:cb292fcdbde1
|
o  changeset:   2:e746dceba503
|
o  changeset:   1:2d50c7ab6b8f
|
o  changeset:   0:c22be856358b
Run Code Online (Sandbox Code Playgroud)

我想要的是:

  @  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
Run Code Online (Sandbox Code Playgroud)

mercurials命令:

hg export -o feature.diff 1 2 3
hg update 0
hg branch feature/my_feature
hg import feature.diff
Run Code Online (Sandbox Code Playgroud)

这是我本地存储库的状态

@  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
Run Code Online (Sandbox Code Playgroud)

现在我需要从默认分支中删除修订版1 2和3.您可以使用mq扩展名中的strip命令执行此操作. hg strip从存储库中删除变更集及其所有后代.

通过在配置文件(.hgrc或Mercurial.ini)中添加以下行来启用扩展:

vim ~/.hgrc 并添加:

[extensions]
mq =
Run Code Online (Sandbox Code Playgroud)

现在在修订版1上删除此存储库.

hg strip 1
Run Code Online (Sandbox Code Playgroud)

我们在这里

@  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
Run Code Online (Sandbox Code Playgroud)

注意:变更集不同但修订版本相同


Mat*_*ius 5

对于那些倾向于使用GUI的人

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

在此输入图像描述

  1. 重启tortoise UI

  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.

在此输入图像描述

希望这能为您节省一些时间.