如何恢复因Git fetch及reset操作丢失的未提交本地修改?
恢复Git误操作前的状态:找回丢失的提交与被覆盖的本地修改
别慌,Git几乎不会彻底删除数据,咱们一步步拆解问题,把你的仓库恢复到误操作前的状态:
第一步:找回被git reset --hard HEAD^丢弃的本地提交
你执行的reset --hard只是把当前分支的指针移到了上一个提交,但之前那个被丢弃的提交其实还在Git的「引用日志」里躺着呢:
- 先运行
git reflog,你会看到一串类似下面的记录:
找到abc1234 HEAD@{0}: reset --hard HEAD^: moving to HEAD^ def5678 HEAD@{1}: commit: 你的提交描述(哪怕当时没填信息,这里也会有默认标识) ghi9012 HEAD@{2}: commit: 上一个正常提交reset --hard之前的那个提交(比如上面的def5678),记下它的提交ID。 - 接着运行
git reset --hard def5678,这样你的本地分支就会回到那个提交的状态了。
第二步:恢复被覆盖的未提交本地修改
你提到本地有未提交修改时执行git fetch后文件被覆盖——其实fetch本身不会修改本地文件,可能是后续的操作(比如误执行了pull或者merge)导致的,但没关系,Git会保留未提交修改的临时快照:
- 运行
git fsck --lost-found,这个命令会把所有Git追踪过但没被引用的文件内容放到.git/lost-found/other/目录下。 - 进入这个目录,用
cat <blob-id>查看每个文件的内容,找到你需要恢复的文件后,把内容复制出来覆盖当前仓库里对应的文件就行。
第三步:解决远程分支冲突,完成推送
现在你的本地分支回到了之前的状态,但远程分支还有网页端的提交,直接push肯定还是会被拒,这时候咱们用变基来整合提交:
- 运行
git pull --rebase origin branchA,这个命令会把远程的新提交拉下来,然后把你的本地提交放到这些提交的后面,避免产生合并提交。 - 等变基完成后,再运行
git push origin branchA,这次就能成功推送到远程了。
内容的提问来源于stack exchange,提问作者stronk_kisik
相关产品推荐
相关产品推荐

