Mercurial:将工作目录切换到分支而不会丢失更改?

问题描述 投票:25回答:5

假设我有一个名为分支'B1',我正在进行功能开发。我在演示之前处于一个很好的停止点,虽然没有使用该功能,所以我:

hg up default
hg merge B1
hg ci -m "merged in feature drop"
hg push

现在我继续工作半小时左右,然后去承诺只是意识到我忘了更新回B1并且我当前的工作目录是在default - 喔。从理论上讲,我应该只能将我的工作目录标记为B1的提示 - 是否有一种简单的方法可以做到这一点?

我当然可以提交,更新回B1,然后合并我的更改,但是默认情况下有一个不稳定的变更集,这对我来说经常发生,我想要一个真正的解决方案。

mercurial branch
5个回答
29
投票

两种方式。首先,显而易见的方式:

hg diff > foo
hg up -C b1
hg import --no-commit foo
rm foo

第二,神奇的方式:

hg up -r 'ancestor(., b1)'  # take working dir back to the fork point
hg up b1                    # take it forward to the branch head

这种方式涉及合并。根据你的分支有多少分歧,这可能是无痛的。或者它可能很复杂,你可能会弄乱你在任何地方都没有保存的更改。这就是为什么像我这样的魔术师更喜欢第一种方式。


10
投票

我会使用搁架扩展。我认为它与TortoiseHg一起发布,您也可以在UI中使用它:

hg shelve --all
hg up B1
hg unshelve

4
投票

qazxsw poi允许您为错误提交的变更集的任何提交更改父级。

如果您只想更改分支以供将来提交 - MQ(如上所述)或Shelve


2
投票

通常对于这种动态方法,我赞成mercurial队列。

在您的情况下,我会做的是在默认情况下使用更改创建补丁,关闭补丁,切换到B1,然后应用补丁。

它类似于:

Rebase extension

0
投票

你需要的只是简单的hg qnew OOPSPATCH hg qrefresh hg qpop hg up B1 hg qpush <hack hack> hg qrefresh hg qfinish

来自hg up -m B1

hg up --help
© www.soinside.com 2019 - 2024. All rights reserved.