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