如何在Hg中撤销已推送的错误合并?
解决Mercurial无法撤销合并变更集的问题
因为Mercurial的hg backout不支持直接撤销合并变更集,结合你当前无其他开发者在my-client分支工作的情况,可以用以下几种方法解决:
方法一:用hg strip彻底移除合并变更集
这个方法会直接删除合并变更集及之后的相关提交,需要先启用strip扩展:
- 检查本地Mercurial配置文件(
.hgrc或Mercurial.ini),确保[extensions]区块下有strip =(没有的话添加该行) - 执行命令移除合并变更集:
hg strip <错误合并的版本号> - 强制推送覆盖远程仓库的
my-client分支:hg push -f my-client
方法二:用hg revert创建撤销提交
这个方法会保留合并的历史记录,新增一个恢复到合并前状态的提交:
- 先找到合并前
my-client分支的版本号:执行hg log -r <错误合并的版本号>,查看该合并变更集的父节点,选择属于my-client分支的那个版本号(记为PREV_REV) - 恢复所有文件到合并前的状态:
hg revert -r PREV_REV --all - 提交恢复操作:
hg commit -m "Revert incorrect merge of new-feature into my-client" - 推送到远程仓库:
hg push my-client
方法三:用hg rollback撤销最后一次操作(仅限刚推送完的场景)
如果合并并推送后,你没有在本地执行其他Mercurial操作,可以用这个快速方法:
- 执行回滚命令撤销合并提交:
hg rollback - 强制推送覆盖远程分支:
hg push -f my-client
注意事项
- 因为当前无其他开发者在
my-client分支工作,强制推送是安全的;后续如果有开发者拉取该分支,需要让他们重置本地分支或重新克隆仓库 - 使用
strip前建议备份仓库,避免误删重要提交 revert方法不会删除历史,适合需要保留操作痕迹的场景;strip则会彻底清除合并记录,更彻底
内容的提问来源于stack exchange,提问作者Jisson
相关产品推荐
相关产品推荐

