我已经对我的本地存储库进行了一些更改,但尚未推送。由于功能上的时间比预期的要长,我想在推送之前将这些更改交换到命名分支。我怎么能这样做?
答案 0 :(得分:149)
根据Mark的建议, 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
就是这样......正如Mark对答案的评论所提到的那样,移动已经推动的变更集通常是一个坏主意,除非你在一个小团队中工作,在那里你能够沟通和执行你的历史操作。
答案 1 :(得分: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
答案 2 :(得分: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
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
注意:变更集不同,但修订版本相同
答案 3 :(得分:5)
对于那些倾向于使用GUI的人
Tortoise Hg
- > File
- > Settings
然后勾选rebase
。重启tortoise UI
创建新分支,您将在其中移动更改。点击当前分支名称 - >选择Open a new named branch
- >选择分支名称。
public
(例如draft
),请转到5.(如果已发布更改但您不是高级开发人员,则应与高级人员交谈(得到一个替罪羊),因为你可能搞砸了很长时间,我不承担任何责任:))。转到View
- > Show Console
(或 Ctrl + L )
然后写入控制台hg phase -f -d 2
- 其中2是最低版本,您将转移到新分支。