git clean -n 必须先运行以预览将删除的未跟踪文件和目录,避免误删如 .env.local、secrets.json 等敏感文件;-d 才能删除目录,-x 会无视 .gitignore 强制清理,需严格区分使用场景。

git clean -n 必须先跑,别跳过这一步
直接敲 git clean -f 就删,等于把工作区交给随机数生成器。Git 不会记录未追踪文件的历史,删了就真没了——连 git reflog 都救不回来。
正确姿势是先用 git clean -n(或加 -d 一起预览目录)看清楚要动哪些东西:
-
git clean -n只列未追踪文件;git clean -n -d还会显示空目录 - 输出里如果出现
.env.local、secrets.json、data/下的 SQL 文件,立刻停手,检查.gitignore是否漏写了这些路径 - 注意 Windows 路径含空格或中文时,
git clean -n输出可能换行错位,建议搭配ls -la手动核对
什么时候必须加 -x,什么时候坚决不能加
-x 的本质是“无视 .gitignore”,不是“更彻底”,而是“更危险”。它会让 node_modules/、.next/、__pycache__/ 全部进删除队列——哪怕你刚 yarn install 完。
- 需要
-x的典型场景:CI 构建前清空镜像层、本地调试完想回归“原始项目状态”、准备提交新版本前做最终验证 - 绝不能加
-x的情况:当前分支还在开发中,且依赖node_modules/或本地生成的 mock 数据;项目使用 Vite/Next.js 等框架,.env.local在.gitignore里但实际在用 -
-X(大写)极少用:它只删.gitignore里的项,反而容易漏掉真正该清的临时文件,比如 IDE 自动生成的.idea/如果没写进.gitignore就逃过一劫
目录清理必须显式带 -d,否则白忙活
Git 默认死守一条线:git clean 不碰任何未追踪目录,哪怕里面只有几个 .tmp 文件。这不是 bug,是硬编码的安全阀——Git 假设目录比文件更可能藏重要东西。
- 只跑
git clean -f:所有未追踪文件被删,但dist/、build/、logs/这些目录原封不动 - 要清空目录,必须加
-d:git clean -fd删文件 + 空目录;git clean -fdx还加上被.gitignore挡住的非空目录(如完整删掉node_modules/) - 如果目录非空但含
.gitignore规则匹配的文件(例如node_modules/.bin/debug-cli),-d本身无效,必须配-x
路径限定比全局清理更安全
全量清理风险高,精准打击更可控。Git 支持按路径范围执行 git clean,这对多模块项目或临时调试特别有用。
- 只清某个子目录:
git clean -fd -- src/temp/(注意--分隔符不能少) - 排除特定类型:
git clean -fd -e "*.log" -e "data/*.sql",-e是额外排除规则,优先级高于.gitignore - 慎用通配符:
git clean -fd -- *.tmp在 shell 层就会展开,如果当前目录没有.tmp文件,命令可能直接报错或误删其他匹配项
最常被忽略的一点:.gitignore 的生效层级。根目录的 .gitignore 不自动覆盖子目录里同名文件,而子目录下的 .gitignore 可能悄悄放行某些本该忽略的文件——git clean -n 的输出里如果出现意外条目,八成是这里出了问题。











