仅拥有远程仓库时如何撤销git push --mirror操作
恢复被
git push --mirror覆盖的GitHub仓库B原有内容 哎呀,这确实是个让人头疼的失误——用镜像推送直接把仓库B的原有提交全覆盖了,不过咱们先别急,试试下面的办法来恢复:
1. 先通过GitHub网页端找回旧提交(最快捷)
GitHub其实会暂时保留被覆盖的提交对象,只是分支指针被改了,咱们可以这么操作:
- 打开仓库B的GitHub页面,点击顶部导航栏的「Insights」(在「Actions」旁边)
- 左侧菜单里选择「Network」,这里能看到仓库所有分支的完整历史轨迹,包括被覆盖的旧
main分支的提交记录 - 找到原来
main分支最后一个提交的哈希值(一串7位或更长的字母数字),把它记下来 - 接下来,点击页面顶部的「Branch: main」输入框,把刚才的哈希值粘贴进去,回车后就能基于这个旧提交创建一个新分支(比如命名为
old-main) - 现在你可以在这个新分支里看到仓库B原来的所有内容了!如果要恢复
main分支,你可以:- 要么创建一个Pull Request,把
old-main合并回main分支 - 要么克隆仓库B到本地,执行:
(用git checkout main git reset --hard 刚才记下的旧提交哈希 git push --force-with-lease main--force-with-lease比直接--force更安全,能避免覆盖其他人的新提交)
- 要么创建一个Pull Request,把
2. 联系GitHub官方支持(如果网页端找不到旧提交)
要是上面的方法没找到旧提交,那可以联系GitHub官方帮忙恢复。他们后台会保留仓库的历史数据一段时间,你需要:
- 进入GitHub的支持页面,提交一个恢复请求
- 说明清楚情况:你误将仓库A通过
git push --mirror推送到仓库B,导致原有提交被覆盖,需要恢复仓库B的历史 - 提供仓库B的完整链接,以及你记得的原有提交最后更新的时间点,这样他们能更快定位到需要恢复的数据
为啥会出现这个问题?
git clone --mirror会克隆源仓库的所有分支、标签和提交历史,而git push --mirror会强制推送所有这些内容到目标仓库,直接覆盖目标仓库对应的分支指针——这就导致仓库B的main分支被换成了仓库A的版本,原有提交的指针虽然没了,但提交对象本身在GitHub服务器上还会保留一段时间,这也是咱们能恢复的基础。
内容的提问来源于stack exchange,提问作者ram




