Git:如何批量删除已经从磁盘删除的文件?
文件已在磁盘上删掉、仓库里还在?用 git add -u 一次性暂存所有删除,或 git rm 逐个处理;附 git clean 清未跟踪文件、常见误删补救与 FAQ。
执行 git add -u(或 git add -A),把所有"磁盘已删但 Git 还跟踪"的文件一次性暂存为删除,然后正常 commit 即可。 -u 只处理已跟踪文件的修改与删除,不会把新文件带进来,最符合这个场景。
1. 场景与解法
手动 rm 了一批文件后,git status 会显示一堆 deleted: xxx(未暂存)。逐个 git rm 太麻烦,批量处理:
git add -u # 暂存所有已跟踪文件的修改和删除
git status # 确认暂存区里是要删的文件
git commit -m "remove deleted files"
git add -u:只更新已跟踪文件(修改+删除),不碰新文件——批量删文件场景最精准。git add -A:暂存所有变化(含新文件),想连新文件一起提交时用。
2. 如果文件还没从磁盘删
想"连磁盘带仓库一起删"时直接用:
git rm file1.txt dir/file2.txt
# 或按模式
git rm '*.log'
git rm = 磁盘删除 + 暂存删除一步完成。只想从仓库移除但保留磁盘文件(比如误提交的密钥),加 --cached:
git rm --cached config/secret.yml
3. 反向场景:清理未跟踪文件
如果问题反过来——磁盘上多了一批不想要的未跟踪文件(编译产物之类):
git clean -n # 先预览会删什么(强烈建议先跑这步)
git clean -f # 真正删除
git clean -fd # 连目录一起
git clean 不可恢复,务必先 -n 预览。
4. 误删了怎么办
git add -u 还没 commit 时:
git restore . # 或 git checkout -- . 把删除恢复回来
已经 commit 了也能从历史找回:git checkout <上一个提交> -- 路径。
常见问题(FAQ)
Q:git add -u 和 git add -A 到底差在哪?
A:-u 只处理已跟踪文件的修改和删除;-A 还会把新建的未跟踪文件一起暂存。批量删除场景用 -u 更不容易误带新文件。
Q:删除之后仓库体积会变小吗?
A:不会。文件仍存在于 Git 历史里。要彻底从历史抹掉大文件,需要 git filter-repo 或 BFG 这类重写历史的工具。
Q:能用通配符删除一类文件吗?
A:未跟踪文件可以 git rm '*.tmp';如果文件已被磁盘删除,先 git add -u 再 commit 是最省事的。