Git 如何撤销工作区所有改动(包括新文件)
在仓库根目录用 git restore --source=HEAD --staged --worktree -- . 丢弃已跟踪改动,再用 git clean -fd 清理普通未跟踪文件;默认保留忽略文件。clean 前先 -n 预览,重要改动先备份。
分两步:git restore --source=HEAD --staged --worktree -- .丢弃所有已跟踪文件的修改;git clean -fd 删除所有未跟踪的新文件和目录。从仓库根目录执行可清理指定范围内的已跟踪改动及普通未跟踪文件;默认保留忽略文件,不等于全新克隆。操作不可逆,clean 前先 -n 预览。
完整操作
# 1. 丢弃已跟踪文件的全部修改
git restore --source=HEAD --staged --worktree -- .
# 2. 预览将要删除的未跟踪文件(强烈建议先看)
git clean -nd
# 3. 确认后真正删除未跟踪文件和目录
git clean -fd
以上按当前目录限定范围;需覆盖仓库时先到根目录。嵌套仓库和子模块有独立边界,不应为追求“干净”盲目追加强制选项。
clean 的常用参数
| 参数 | 作用 |
|---|---|
-n |
演习:只列出将删什么,不真删 |
-f |
强制执行(不带会拒绝) |
-d |
连未跟踪的目录一起删 |
-x |
连 .gitignore 忽略的文件也删(如 build 产物、.env) |
-i |
交互模式逐个确认 |
git clean -fdx # 同时清理忽略文件(可能包含 .env、node_modules),先用 -ndx 预览
更稳妥的替代:stash
不确定是否真要丢弃?先 stash 存起来,后悔了还能找回:
git stash -u # 连未跟踪文件一起收,不含忽略文件
常见问题(FAQ)
Q:clean 删除的文件能找回吗?
Git 无法恢复从未保存到对象库的内容;只能尝试独立备份或文件系统恢复。这是先 -n 预览、或用 stash 替代的原因。
Q:git reset --hard 也能还原,和 restore 有什么区别?
git reset --hard HEAD 同时重置暂存区和工作区到 HEAD(已跟踪文件层面效果相同);但它可能删除阻挡检出路径的未跟踪文件,不能认为绝不影响未跟踪内容;其余清理由 clean 处理。restore 语义更聚焦"还原文件"。
Q:连 .env 也想删但它在 .gitignore 里?
git clean -fdx。日常想保留 .env 就别加 -x。