Git恢复文件:误强制推送后丢失新文件的恢复方法咨询
恢复强制推送后丢失的文件与内容
别慌,你猜的方向完全没错——那些丢失的内容很大概率还以悬空Blob或不可达对象的形式藏在本地Git仓库里,咱们一步步来确认和恢复:
一、先确认丢失的对象是否存在
1. 查看Git操作轨迹(Reflog)
强制推送会覆盖本地分支的历史,但Git会悄悄记录所有HEAD的变更路径,你用这个命令就能找回之前的提交记录:
git reflog
输出会是类似这样的条目:
abc1234 HEAD@{0}: push -f: forced update def5678 HEAD@{1}: commit -a: add new files and dirs
这里的def5678就是你执行强制推送前的提交哈希——这个提交里就包含你创建的新文件,先把这个哈希记下来。
2. 扫描不可达对象与悬空Blob
用git fsck命令可以揪出仓库里所有无法通过当前分支/标签访问到的对象,包括未追踪文件变成的悬空Blob,以及被覆盖的旧提交:
git fsck --lost-found
执行后,Git会把找到的不可达对象放到.git/lost-found/目录下:
.git/lost-found/blobs/:存放所有悬空文件内容的Blob对象.git/lost-found/commits/:存放被覆盖的不可达提交对象
二、恢复你需要的内容
1. 从Reflog的旧提交里提取文件
如果你找到了强制推送前的提交哈希(比如上面的def5678),先创建一个临时分支来保存这个提交的内容,避免误操作:
git checkout -b temp-recovery def5678
现在你可以在这个临时分支里看到所有丢失的新文件,直接把需要的文件复制到当前工作区就行(不用合并整个分支,避免带入有问题的历史)。
2. 恢复悬空Blob(未提交的未追踪文件)
如果你的新文件还没来得及提交就丢失了,它们会以悬空Blob的形式存在。你可以逐个查看Blob的内容来确认:
git show <blob-hash>
找到对应的Blob后,把内容写回本地文件:
git cat-file -p <blob-hash> > path/to/your/lost/file
比如你要恢复src/new-module.js,就执行:
git cat-file -p abc1234 > src/new-module.js
三、额外确认:检查本地refs备份
Git有时会在分支被覆盖前自动创建备份,你可以看看.git/refs/original/目录(如果存在的话),里面可能保存着强制推送前的分支引用:
ls .git/refs/original/
如果有内容,你可以直接查看这个引用对应的提交:
git show refs/original/heads/your-branch-name
内容的提问来源于stack exchange,提问作者Gal Grünfeld




