如何恢复git reset --hard操作后丢失的未提交代码更改?
Git硬重置后未提交改动找回方案
问题背景
误用次要GitHub账号完成代码提交后,为删除错误提交依次执行了以下命令:
git reset --hard HEAD~1 git push -f origin development
命令执行后未达到删除错误提交的预期,同时本地部分未提交的改动意外丢失,无法直接查看丢失内容。
未提交改动找回步骤
git reset --hard 会直接清空当前工作区、暂存区的所有未提交修改,这类改动没有生成正式提交记录,但可以通过以下路径尝试找回:
- 通过Git悬空对象找回
Git会将所有曾经写入对象库的内容(包括执行过git add的暂存文件、曾经提交过的内容)临时留存,直到自动垃圾回收(一般默认留存数周)。执行以下命令扫描所有游离的文件对象:
扫描完成后,所有可恢复的游离文件会被存放在本地仓库路径git fsck --lost-found.git/lost-found/other/下,文件以Git哈希值命名,逐个查看文件内容即可匹配到你丢失的未提交改动。 - 通过Git引用日志找回暂存记录
如果丢失的改动曾经被加入过暂存区,可以通过操作日志定位重置前的状态:
在输出的记录里找到执行git reflog -ggit reset --hard操作前的对应节点哈希,执行以下命令即可查看当时的文件内容,手动恢复对应文件即可:git show <你找到的节点哈希值> - 通过编辑器本地历史找回
如果丢失的改动从来没有执行过git add,没有被Git写入对象库,Git层面没有留存记录,可以通过你使用的代码编辑器自带的本地历史功能找回:比如VS Code的资源管理器时间线功能、JetBrains系列IDE的Local History功能,这类功能会自动留存本地编辑的文件版本,不需要Git追踪也能恢复。
之前删除错误提交失效的原因
执行重置和强推后没有删掉远程错误提交,大概率是执行命令时你本地所在的分支不是对应远程development的追踪分支,或者本地分支没有同步到最新的远程提交记录,重置的提交点和远程最新的错误提交不匹配,强推后自然不会覆盖掉远程的错误提交。后续操作时先切到本地development分支,拉取最新远程状态确认提交链路后,再回退到正确提交点执行强推即可。
内容的提问来源于stack exchange,提问作者r121
相关产品推荐
相关产品推荐

