合并失误后恢复Mercurial Shelf及Unshelve出错后找回原补丁咨询
关于Mercurial暂存补丁(Shelf)的恢复方案
一、合并失误后,如何找回暂存补丁?
别慌!Mercurial的shelf补丁默认存在本地仓库的.hg/shelves/目录下,只要你没主动清理或删除这个目录,补丁文件就还在那里。具体操作:
- 进入仓库根目录,查看
shelves文件夹内容:ls .hg/shelves/(Windows用dir .hg\shelves),里面的文件就是暂存补丁——要么是自动生成的patch-xxxxxx格式,要么是你shelve时用--name指定的自定义名称。 - 想确认补丁内容,直接执行
hg cat .hg/shelves/[你的补丁文件名]就能查看完整代码。 - 要重新使用补丁,直接运行
hg unshelve [补丁名]即可,完全不受之前合并失误的影响。
二、Unshelve合并后发现错误,如何恢复原始补丁并重做?
分两种场景处理:
1. 还没提交合并后的修改
这是最容易解决的情况:
- 执行
hg update -C .,这个命令会强制将本地工作目录恢复到最近一次提交的状态,所有未提交的合并修改都会被丢弃。 - 恢复后,原始shelf补丁依然完好保存在
.hg/shelves/里,你可以重新执行hg unshelve,甚至先编辑补丁内容再重新合并。
2. 已经提交了合并结果
这时候需要先回滚提交:
- 如果是刚提交不久,用
hg rollback就能撤销最近一次提交,回到合并前的状态。 - 如果提交已经过去一段时间,先通过
hg log找到合并前的节点ID,再执行hg revert -r [节点ID] --all,将工作目录恢复到那个状态。 - 无论哪种方式,原始的shelf补丁都还在
.hg/shelves/中,你可以重新进行unshelve操作。
几个实用小技巧
- 执行
unshelve前,先用hg unshelve --dry-run预览补丁会修改哪些文件,提前规避可能的合并冲突。 - 若要修改已存的shelf补丁内容,直接编辑
.hg/shelves/下的对应文件即可,部分新版本Mercurial也支持hg shelve --edit [补丁名]命令。 - 谨慎使用
hg unshelve --clean,这个参数会在unshelve完成后直接删除shelf里的补丁文件,除非你确定以后再也不需要它。
内容的提问来源于stack exchange,提问作者Joshua Goldberg
相关产品推荐
相关产品推荐

