误强制推送删除远程分支7个提交,如何恢复?
别慌!这种用强制推送覆盖远程分支导致历史提交丢失的情况,完全有办法恢复——Git其实不会轻易删掉提交,只是暂时让它们脱离了分支的“指向”而已。结合你提到的合并提交细节,我给你一步步拆解解决方案:
恢复被覆盖的远程提交步骤
第一步:找回被删除的7个提交的头部哈希
Git会把所有仓库操作记录在reflog(引用日志)里,哪怕你做了强制推送,这些记录也不会丢。
- 运行这个命令查看所有本地操作记录:
你要找的是强制推送之前,本地对应远程分支(比如git reflogorigin/<你的分支名>)的最后一个提交哈希——看起来会像这样:abc123 HEAD@{5}: pull origin main: Fast-forward,找到那条记录里的哈希值就行。 - 如果reflog里找不到,还可以用
git fsck --lost-found找出所有“悬空提交”(没有被任何分支/标签指向的提交),那些被删除的7个提交肯定在这个列表里。
另外,你提到用了合并提交的哈希做推送,还可以直接查看这个合并提交的父节点:
git show <你的合并提交SHA>
输出里会有Parent:字段,其中一个父节点就是原分支的头部(也就是包含那7个提交的分支末端),直接拿这个父节点哈希就行。
第二步:在本地恢复分支
拿到原分支的头部哈希(假设叫<original-head-sha>)后,先把本地分支切回正确状态:
git checkout <你的分支名> git reset --hard <original-head-sha>
如果本地没有这个分支,也可以先创建一个临时分支来保存恢复的提交:
git checkout -b recover-temp-branch <original-head-sha>
第三步:推回远程仓库(谨慎操作!)
现在本地已经恢复了所有被删除的提交,你需要把它们推回远程,覆盖之前错误的强制推送:
git push -f origin <original-head-sha>:<你的分支名>
⚠️ 重要提醒:如果这期间有其他开发者拉取了被你覆盖的分支并做了新提交,一定要先和他们沟通!不然这次强制推送会覆盖他们的工作,造成新的问题。
预防下次踩坑的小建议
- 永远不要随便用
git push -f,除非你100%确认没有其他人在这个分支上工作,或者已经和所有协作成员沟通完毕。 - 推送前养成拉取的习惯,用
git pull --rebase可以避免很多不必要的冲突和覆盖问题。 - 对于main/master这类核心分支,直接在远程仓库(比如GitHub)设置分支保护规则,禁止强制推送,从根源避免误操作。
内容的提问来源于stack exchange,提问作者Gaurav Sachdeva
相关产品推荐
相关产品推荐

