Git操作失误丢失本地Java代码,如何恢复?
首先先给你吃个定心丸:Git的设计原则就是尽量不删除数据,你丢失的代码并没有被真正删除,只是暂时从master分支上“消失”了,我们可以通过Git的日志和引用记录把它找回来。
核心原因分析
你当初执行git reset --hard origin/master时,只是把本地master分支的指针强制指向了远程仓库的b6e9668提交(也就是包含LICENSE和.gitignore的那个版本),但你自己写的代码所在的本地提交,其实还保存在Git的本地数据库里——只要你没执行过强制清理Git垃圾的命令(比如git gc --prune=now),这些提交就会被reflog(Git的操作日志)记录90天。
一步步找回代码
1. 查看完整的操作日志(reflog)
你之前贴的reflog只显示了部分记录,先执行这条命令查看所有操作历史:
git reflog show --all --date=iso
这条命令会列出你所有的Git操作,包括每一次分支切换、reset、commit等,每条记录都会有类似HEAD@{n}: 操作描述的格式。
你需要找到执行git reset --hard origin/master之前的那条记录——比如你会看到一行类似:
abc1234 HEAD@{5}: reset: moving to origin/master
那在它的上一条(比如HEAD@{6})就是你执行reset前的本地分支状态,对应的哈希值(比如def7890)就是你丢失代码所在的提交。
2. 验证并恢复代码
找到那个目标提交哈希后,先切换到该提交查看代码:
git checkout <目标提交哈希>
这时候你应该就能看到自己之前写的代码了。如果确认这就是你要找的内容,立刻创建一个新分支来保存它(避免后续操作再次丢失):
git branch recover-my-code <目标提交哈希>
之后你可以把这个恢复分支合并回master,或者直接基于这个分支继续开发。
3. 备选方案:如果reflog找不到,用fsck查找“丢失”的提交
如果因为多次操作导致reflog里的记录被覆盖,还可以用Git的垃圾回收检查工具找出所有无引用的提交:
git fsck --lost-found
这条命令会把所有未被分支、标签引用的提交对象存到.git/lost-found/commit/目录下。你可以逐个查看这些提交的内容:
git show <目录里的哈希文件名>
找到包含你代码的提交后,同样用git checkout+创建分支的方式保存。
为什么你之前的操作没效果?
你后来执行的git reset --hard HEAD@{1}、git pull --rebase等操作,都是基于你已经reset后的分支状态进行的,当时的HEAD@{1}已经不是你最初丢失代码的那个提交了,所以自然看不到变化。
另外,你执行git stash保存的WIP是你最近操作的临时改动,和你最初丢失的代码无关,但也可以用git stash apply恢复看看有没有有用的内容。
内容的提问来源于stack exchange,提问作者Arefe

