Git 如何撤销工作区所有改动(包括新文件)
彻底回到上次提交状态:git restore .(或 git checkout -- .)丢弃已跟踪文件的改动,git clean -fd 删除未跟踪的新文件和目录。两步都要才能完全干净;clean 前先 -n 预览。操作不可逆,谨慎执行。
分两步:git restore .(旧写法 git checkout -- .)丢弃所有已跟踪文件的修改;git clean -fd 删除所有未跟踪的新文件和目录。两个命令一起才能把仓库彻底还原到最近一次提交的状态。操作不可逆,clean 前先 -n 预览。
完整操作
# 1. 丢弃已跟踪文件的全部修改
git restore .
# 旧写法:git checkout -- .
# 2. 预览将要删除的未跟踪文件(强烈建议先看)
git clean -nd
# 3. 确认后真正删除未跟踪文件和目录
git clean -fd
clean 的常用参数
| 参数 | 作用 |
|---|---|
-n |
演习:只列出将删什么,不真删 |
-f |
强制执行(不带会拒绝) |
-d |
连未跟踪的目录一起删 |
-x |
连 .gitignore 忽略的文件也删(如 build 产物、.env) |
-i |
交互模式逐个确认 |
git clean -fdx # 彻底到"刚克隆"的状态(连 node_modules 都删)
更稳妥的替代: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。