我有一些修改已经提交到了我的本地代码库,但是还没有推送到远程仓库。由于某个功能的开发时间比预期要长,我想在推送之前将这些修改切换到一个命名分支上。我该如何操作呢?
正如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
就这样了...如Mark的回答中所提到的评论,移动已经推送的变更集通常是一个坏主意,除非你在一个小团队中工作,在那里你能够交流并执行你的历史操作。
你可以使用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
hg qq -c rebranch
以避免干扰可能在队列中的其他补丁。 - anatoly techtonikhg 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
Mercurial 命令:
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
hg strip
会从存储库中删除变更集及其所有后代。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
-> 文件
-> 设置
,然后勾选 rebase
。重新启动Tortoise UI。
创建新分支,在当前分支名称上单击 -> 选择 打开新命名的分支
-> 选择分支名称。
进入 查看
-> 显示控制台
(或 Ctrl + L)然后在控制台中输入 hg phase -f -d 2
- 其中2是您将要移动到新分支的最低修订版本。
进入分支和修订版本(如果您正在将更改移动到第3步创建的新分支,则应该是最高修订版本)。 右键单击
-> 更新
进入您将从中移动更改的分支和修订版本 右键单击
-> 修改历史记录
-> Rebase
点击 Rebase
,祈祷没有冲突,必要时进行合并。
推送更改,此时所有修订版本仍应为 draft
。
进入您将更改移动到的分支中的最高修订版本 右键单击
-> 更改阶段为
-> 公共
。