执行git push -f强制推送后GitHub所有提交丢失如何找回
被强制推送覆盖的Git仓库提交记录找回方案
强推操作后丢失的提交不会被立刻永久删除,只要操作发生时间不超过30天,基本可以完整找回所有历史记录,按优先级从高到低选择方案操作即可:
方案1:通过GitHub分支事件日志找回(成功率最高,优先选择)
- 打开目标GitHub仓库的网页端,切换到被覆盖的
master分支 - 在浏览器地址栏的仓库根路径后追加
/network/events访问分支事件日志页,该页面会记录所有分支指针的变更历史 - 在事件列表中定位到你执行强制推送操作前,
master分支指向的最后一条提交,复制该提交完整的40位哈希值 - 本地任意目录下执行命令拉取该历史提交并恢复远程分支:
git clone --no-checkout https://github.com/cameronmcnz/example-website.git temp-repo cd temp-repo git reset --hard <你复制的40位提交哈希> git push -f origin master
执行完成后远程仓库的master分支就会恢复到强推前的状态,所有原有1000余条提交链会完整恢复,确认恢复正常后删除临时的temp-repo目录即可。
方案2:通过悬空提交对象找回
如果无法访问事件日志,可通过Git的悬空对象检索功能找回:
- 如果你之前在任意设备上克隆过该仓库,直接进入对应本地仓库目录,执行
git reflog命令,即可看到所有本地记录过的分支变更历史,从中找到强推前master分支对应的最新提交哈希,按方案1中的重置+强推步骤恢复即可。 - 如果没有留存任何旧的本地仓库副本,执行以下命令拉取远程所有悬空对象:
git clone https://github.com/cameronmcnz/example-website.git temp-repo cd temp-repo git fsck --full --no-reflogs --unreachable --lost-found
命令执行完成后会列出所有未被分支引用的悬空提交,通过git show <提交哈希>逐个核对提交时间、提交信息,找到强推前分支顶端的提交哈希后,重置分支并强制推回远程即可。
注意:不需要逐个找回1000余条提交,只要找到强推前分支最顶端的那个提交即可,该提交会自动关联整条历史提交链,一次重置就能恢复全部记录。
问题原因说明
你执行的git push -u -f origin master属于强制覆盖操作,本地通过git init创建的仓库和远程原有仓库没有共同的提交祖先,强制推送后远程master分支的指针被直接指向了你本地新建的孤立提交,原有提交链因为失去分支引用变成悬空对象,但GitHub默认会保留这类对象至少30天,不会立刻物理删除。
后续关联本地已有项目到远程仓库时,不要直接初始化后强推,正确操作流程如下:
git init git remote add origin <仓库地址> git fetch origin git reset origin/master git add . git commit -m "add local project files" git push origin master
内容的提问来源于stack exchange,提问作者Charlie Østergaard
相关产品推荐
相关产品推荐

