Git 如何丢弃未暂存的改动

丢弃未暂存改动:单个文件 git restore <文件>(旧语法 git checkout -- <文件>),当前目录及子目录用 git restore . 或 git checkout -- .,全仓操作从仓库根目录执行。未跟踪的新文件用 git clean -f。Git 不保证恢复未保存改动,丢弃前可用 git diff 最后确认。

最佳实践
Git 分支协作与合并示意

单个文件:git restore 文件名;当前目录及子目录:git restore .(Git 2.23 之前的旧语法是 git checkout -- 文件名)。这会把已跟踪文件还原到暂存区的内容(若已暂存不同版本,并不是 HEAD),未暂存的修改就此消失,Git 无法保证恢复。

按范围丢弃

git restore src/app.js        # 单个文件
git restore src/              # 整个目录
git restore .                 # 当前目录及子目录中的跟踪文件;全仓请从仓库根目录执行

连带处理其他状态

git restore --staged .        # 已暂存的撤出暂存区(变成未暂存)
git clean -fd                 # 删除未跟踪的新文件/目录
git reset --hard              # 一条命令还原暂存区+工作区(可能删除挡住检出路径的未跟踪文件)

丢弃前最后一眼

git diff                      # 查看所有未暂存改动
git diff src/app.js           # 只看这个文件

不想丢,只是想挪开?

git stash                     # 默认不含未跟踪/忽略文件;之后 stash pop 找回
git stash push -m "备注"       # 加备注更好认

常见问题(FAQ)

Q:restore 之后能找回吗?

若改动从未被暂存、stash、提交或独立备份,Git 通常无法恢复;已有其他保存副本时则可尝试找回。这就是为什么 stash 是更安全的"撤销"。

Q:git checkout -- . 和 git restore . 一样吗?

一样。restore 是 Git 2.23 引入的语义更明确的新命令(checkout 身兼切分支和还原文件两职太混乱),老语法仍然兼容。

Q:为什么 git clean 默认要加 -f?

防止误删的保护:不带 -f 或 -n(预览)时 Git 拒绝执行。养成先 git clean -nd 预览的习惯。

参考资料

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

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

立即开始

选择观测云版本

代码托管平台