Git 如何撤销工作区所有改动(包括新文件)

在仓库根目录用 git restore --source=HEAD --staged --worktree -- . 丢弃已跟踪改动,再用 git clean -fd 清理普通未跟踪文件;默认保留忽略文件。clean 前先 -n 预览,重要改动先备份。

最佳实践
Git 提交历史与版本恢复示意

分两步: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。

参考资料

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台