执行Git Pull (rebase)后项目全部文件被删除,如何恢复丢失的代码?
Git rebase后文件丢失恢复方案
优先操作:禁止执行任何写入类Git命令
在完成恢复前,不要执行git add、git commit、git pull、git checkout、新的rebase等操作,避免Git覆盖存储的历史对象导致永久丢失。
最高成功率恢复方法:从reflog恢复操作前的提交
Git会记录近90天内所有HEAD的移动记录,rebase操作并不会删除旧提交,仅会修改HEAD指向:
- 执行命令查看操作日志:
git reflog - 在输出的列表中找到你执行pull rebase操作之前的那条记录,对应的哈希值一般格式为
HEAD@{n}(n为数字,通常最近的操作在最上面,rebase前的记录大概率是HEAD@{1}) - 执行重置命令恢复到操作前的状态:
git reset --hard 你找到的对应哈希值
执行完成后即可查看项目文件,90%以上的这类情况都可以通过这个方法完全恢复。
备选恢复方法:从Git对象直接恢复文件
如果reflog没有对应记录,可以直接用你操作日志里已经查到的文件哈希导出文件:
- 恢复src/index.ts:
git cat-file -p f0ae144245ab480bd437b97be9d58d267399b602 > ./src/index.ts - 恢复dist/index.js:
git cat-file -p d6cf00e78b8901535facadfd2f1b02afefe5ec2f > ./dist/index.js
如果还有其他丢失的文件,可以执行git fsck --lost-found扫描所有悬空的Git对象,所有扫描到的文件都会存放在项目根目录的.git/lost-found/blob/路径下,逐个查看文件内容即可找回你需要的其他代码文件。
额外兜底方案:IDE本地历史恢复
如果你使用VSCode、WebStorm、IDEA这类IDE开发,可以右键项目根目录,找到「本地历史」/「Local History」选项,IDE会独立记录所有文件的修改记录,不受Git操作影响,可以直接选择对应时间点的版本恢复文件。
后续操作建议
- 所有涉及rebase、merge、reset这类会修改提交链的操作前,先创建备份分支:
git branch backup_xxxxxx,操作出问题可以直接切回备份分支 - 推送失败时先查看报错信息,如果是「远程分支存在本地没有的提交」类错误,先执行
git fetch拉取远程提交,对比本地和远程的差异后再选择merge或者rebase操作,不要直接执行pull rebase。
内容的提问来源于stack exchange,提问作者King Of Chads
相关产品推荐
相关产品推荐

