Mercurial:撤消与未提交更改的自动合并

时间:2013-11-13 19:57:09

标签: mercurial merge

我在一个文件夹上做了hg pullhg update,我发现了一些未经修改的更改。它打开了几个文件的三向比较/合并工具,但我关闭了它们,因为我不记得更改是旧的还是比repo中的更新 - 我认为这会使文件冲突就像它在SVN中所做的那样..但是没有,所有文件都被合并了:

  

更新到分支默认
  更新了25个文件,合并了0个文件,删除了0个文件,未解决了0个文件

不幸的是,合并以一种不起作用的方式混合了两个版本。

因此,我的问题是,是否有办法撤消合并并取回本地文件(带有未经修改的更改),就像我调用hg update之前一样?

(我找到this post,其中一位评论者建议hg resolve --tool internal:local,但在我的案例中似乎没有做任何事情。)

感谢。

1 个答案:

答案 0 :(得分:7)

正如您发现的那样,Mercurial会在您更新时将工作副本中的更改合并到目标修订版中。

如果合并是干净的(从Mercurial的角度来看),受影响的文件将标记为“已解决”。您可以使用

进行检查
$ hg resolve --list

它会显示一堆文件,其R已解决。未解析的文件与U一起列出。在hg resolve处理文件之前,您必须先将其标记为未解析:

$ hg resolve --unmark your-file

这是一个完整的会话,我用两个提交创建一个提交:

$ hg init
$ echo x > x
$ hg commit -A -m x
adding x
$ echo xx >> x
$ hg commit -m xx

然后我更新到第一个提交(文件包含x)并将其更改为y

$ hg up 0
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ echo y > x

更新回第二次提交会触发合并,该操作会成功:

$ hg up 
merging x
0 files updated, 1 files merged, 0 files removed, 0 files unresolved
$ hg resolve --list
R x
$ cat x
y
xx

在我恢复文件之前,我需要将其标记为未解析。然后我可以使用internal:local工具解决它:

$ hg resolve --unmark x
$ hg resolve --tool internal:local x
$ cat x
y

合并状态存储在.hg/merge中。你会在那里找到SHA-1哈希的一堆文件名。我建议在开始播放上述命令之前复制一下这个目录,因为Mercurial会在认为不再需要时删除该目录。