能恢复,分清删工作区文件(用git checkout --)还是删已提交内容(用git reflog找回);误删未add时直接还原,已commit未push时通过reflog检出,已push则正向修复提交。

能恢复,但必须分清“删的是工作区文件”还是“删的是已提交的历史内容”——前者用 git checkout --,后者得靠 git reflog 找回被覆盖的提交。
误删文件后还没 git add,直接从暂存区还原
这是最常见也最容易救的情况:你用 rm 或 IDE 删除了已跟踪文件,git status 显示 deleted:,但没执行过 git add 或 git commit。
-
git checkout -- <file-path>就能立刻把文件从暂存区(即上一次提交的状态)恢复回来 - 如果删了一堆文件,可以用
git checkout -- .一次性还原当前目录下所有已跟踪但被删的文件 - 注意:
git checkout --不会动暂存区,也不会新建提交,只是覆盖工作区
误删后已经 git add + git commit,但还没 push
此时“删除”本身已成为一次新提交,原始文件内容还在历史里,只是 HEAD 指向了这个错误提交。关键不是删掉这次提交,而是把原始内容捞回来。
- 先用
git reflog查看操作记录,找到删除前的那个HEAD@{n}(比如HEAD@{2}) - 运行
git checkout HEAD@{2} -- <file-path>把文件从那个时间点检出 - 或者更稳妥:先
git checkout -b rescue-branch HEAD@{2}切到旧状态建分支,再挑需要的文件复制回来 - 别直接
git reset --hard HEAD~1,除非你确定后面所有提交都不要
误删后已 push 到远程,团队其他人可能已基于错误提交开发
这种情况绝对不能动历史——git reset --hard + git push -f 会破坏他人本地分支,引发冲突雪球。
- 正确做法是“正向修复”:用
git log --oneline -- <file-path>找到该文件最后一次正常存在的提交哈希(比如a1b2c3d) - 执行
git checkout a1b2c3d -- <file-path>把文件内容恢复到工作区 - 然后
git add <file-path>+git commit -m "restore deleted file"+git push - 这个新提交干净、可追溯、不影响任何人,是协作环境里的唯一安全解法
最容易被忽略的一点:只要没运行 git gc --prune=now,reflog 里至少保留着最近 90 天的操作痕迹;但一旦你继续提交、切分支、rebase,旧的 reflog 条目就可能被覆盖——所以发现误删后,第一件事不是敲命令,是停下所有写操作,先 git reflog 看一眼再说。


















