如何找回 Git 仓库中被删除的文件
找回被删文件:git log --diff-filter=D -- <路径> 定位删除提交,然后 git restore --source=<删除前的提交>^ <路径> 恢复。不记得路径用 git log --name-status 或 git log -S"文件内容关键词" 搜。
只要文件曾被提交过就丢不了:先找到删除它的提交(git log --diff-filter=D -- 路径),再从该提交的父提交恢复:git restore --source=<删除提交>^ -- 路径(旧语法 git checkout <哈希>^ -- 路径)。
标准恢复流程
# 1. 找到删除该文件的提交
git log --diff-filter=D --oneline -- path/to/deleted.js
# 输出:e4f5g6h 删除多余文件
# 2. 从删除前的版本恢复(注意 ^ 表示父提交)
git restore --source=e4f5g6h^ path/to/deleted.js
git commit -m "恢复误删的 deleted.js"
不记得文件路径时
# 按内容关键词搜(删掉的文件里有这段代码)
git log -S"某个函数名" --oneline
# 看历次提交涉及的文件变动
git log --name-status --oneline | grep -B1 '^D'
刚删还没提交的情况
git restore path/to/file # 工作区误删、未提交:直接还原
已 git rm 暂存但未提交:git restore --staged --worktree 路径 两步还原。
常见问题(FAQ)
Q:删除发生在很久以前、分支都合并过几轮了还能恢复吗?
能。Git 的提交历史是永久图结构,任何祖先提交里的文件都拿得回来。git log --all -- 路径 跨所有分支搜索。
Q:文件从未提交过就被删了怎么办?
Git 无能为力(它只管理提交过的内容)。试试编辑器本地历史(VS Code 的 Local History、JetBrains 的 Local History)、系统回收站或备份。
Q:想看文件被删前的完整内容但不想恢复?
git show e4f5g6h^:path/to/deleted.js 直接输出到终端。