You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

仅拥有远程仓库时如何撤销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更安全,能避免覆盖其他人的新提交)

2. 联系GitHub官方支持(如果网页端找不到旧提交)

要是上面的方法没找到旧提交,那可以联系GitHub官方帮忙恢复。他们后台会保留仓库的历史数据一段时间,你需要:

  • 进入GitHub的支持页面,提交一个恢复请求
  • 说明清楚情况:你误将仓库A通过git push --mirror推送到仓库B,导致原有提交被覆盖,需要恢复仓库B的历史
  • 提供仓库B的完整链接,以及你记得的原有提交最后更新的时间点,这样他们能更快定位到需要恢复的数据

为啥会出现这个问题?

git clone --mirror会克隆源仓库的所有分支、标签和提交历史,而git push --mirror会强制推送所有这些内容到目标仓库,直接覆盖目标仓库对应的分支指针——这就导致仓库B的main分支被换成了仓库A的版本,原有提交的指针虽然没了,但提交对象本身在GitHub服务器上还会保留一段时间,这也是咱们能恢复的基础。

内容的提问来源于stack exchange,提问作者ram

火山引擎 最新活动