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

时间:2011-10-11 16:08:30

标签: mercurial branch

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

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

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

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

5 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:10)

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

hg shelve --all
hg up B1
hg unshelve

答案 2 :(得分:4)

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

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

答案 3 :(得分:2)

通常对于这种动态方法,我更喜欢mercurial队列。

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

它类似于:

hg qnew OOPSPATCH
hg qrefresh 
hg qpop 
hg up B1 
hg qpush

<hack hack>

hg qrefresh 
hg qfinish

答案 4 :(得分:1)

您只需要简单的hg up -m B1

来自hg up --help

options:  
  …  
  -m --merge      merge uncommitted changes  
  …