如何在 Git 提交历史中查找被删除的文件
列出历史上的删除记录:git log --diff-filter=D --summary 显示所有删除文件及所在提交;按内容搜用 git log -S"关键词";确认路径后 git log --all -- <路径> 追踪该文件的完整历史。
Git 不会忘记任何提交过的文件。 列出全部删除事件用 git log --diff-filter=D --summary;知道大概内容用 git log -S"关键词" 做全文考古;确认路径后 git log --all -- 路径 看它的完整生命周期。
列出所有删除记录
git log --diff-filter=D --summary | grep delete
# delete mode 100644 src/legacy/old-module.js
# ...
按内容搜索(不记得文件名)
git log -S"calculateDiscount" --oneline --all # 含这段代码的提交变动
git log -G"password|secret" --oneline --all # 正则版本
-S 找"该字符串出现/消失"的提交,-G 支持正则、匹配范围更宽。
按路径追踪
git log --all --oneline -- path/to/file # 该文件的所有历史(跨分支)
git log --all --diff-filter=A -- 路径 # 它在哪次提交诞生
git log --all --diff-filter=D -- 路径 # 在哪次被删
找到之后
git show <删除提交>^:路径 # 看删除前的内容
git restore --source=<删除提交>^ 路径 # 恢复到工作区
常见问题(FAQ)
Q:文件被重命名过,历史断在改名点怎么办?
git log --follow -- 路径 跨重命名跟踪。注意 --follow 一次只跟一个路径。
Q:整个目录被删了怎么查?
路径参数接受目录:git log --diff-filter=D --summary -- src/old-module/,同样能找到。
Q:想找出"谁删的"?
git log --diff-filter=D --format='%h %an %ad %s' -- 路径,作者、时间、提交说明一目了然。