2011-05-03 25 views
4

让我们假设它执行合并“放弃所有更改从合并...”选项,BU事故。恢复“放弃所有更改”合并效果

而这个错误提交已被提交到“中央”存储库。

如何处理这种情况,如果我需要以正确的方式合并分支变化?

命令重现的情况:

hg init mr 
cd mr 

echo "123" > file.txt 
hg add 
hg ci -m "initial" 

hg branch br 
echo "234" >> file.txt 
hg ci -m "in branch" 

hg up default 
echo "567" >> file.txt 
hg ci -m "in default" 

这些命令打开tortoisehg后,与br分支“放弃...”选项合并第二次修正(默认头)。

UPD

这是一个关于做相反How to merge to get rid of head with Mercurial command line, like I can do with TortoiseHg? ;-)

问题,但仍无法找到如何恢复这一步:-(

回答

2

一种方法是重做在你的例子中,更新回第二个版本(在做错误合并之前,当前工作目录为parent),然后是红色o与其他分支合并。这次做得很好。

这会给你另一个头。

然后,合并旧的,不正确的合并,并选择丢弃。现在,您已经有效地绕过了正确的合并。

如果您不确定步骤,进行本地克隆和实验,您可以随时丢弃它并重新尝试并重试。

修订3是旧的,不正确的合并,我选择丢弃。在合并4和5之后,合并的痕迹消失了,一切都恢复正常。是的,历史看起来有点时髦,但相信我,完全摆脱这种糟糕合并的清理程序远比历史时间表上的小木瓜更糟糕。

基本上你拙劣的合并后,这样的场景:

  +-- botched merge 
      v 
    0---2---3 
    \ /
     1---+ 

所以你更新回你的坏合并之前所拥有的工作文件夹的父,并妥善做好另一个合并,这个时候。现在,它看起来像这样:现在

  +-- botched merge 
      v 
    0---2---3 
    \ \/
     \ x 
     1-+-4 
     ^
      +-- good merge 

你的工作文件夹是在修订4,所以你又合并,这次修订3(坏的合并),并选择放弃这些变化,你会得到这样的:

  +-- botched merge 
      v 
    0---2---3-5 <-- final merge, discard 3 
    \ \// 
     \ x/
     1-+-4 
     ^
      +-- good merge 

这里的TortoiseHg是如何显示的:

history after new merges

+0

是的,我已经确切地做同样的伎俩(因为很明显),但我希望这是一个*有效*解以某种方式退出错误的合并:-(顺便说一句,你如何“画”美妙的图表?!?! – zerkms 2011-05-03 11:02:54

+0

哪个图? ascii图表或TortoiseHg吗? – 2011-05-03 14:26:16

+0

ascii ones显然;-) – zerkms 2011-05-03 21:56:56