Git 如何丢弃未暂存的改动
丢弃未暂存改动:单个文件 git restore <文件>(旧语法 git checkout -- <文件>),全部文件 git restore . 或 git checkout -- .。未跟踪的新文件用 git clean -f。操作不可逆,丢弃前可用 git diff 最后确认。
单个文件:git restore 文件名;全部:git restore .(Git 2.23 之前的旧语法是 git checkout -- 文件名)。这会把已跟踪文件还原到最近一次提交的内容,未暂存的修改就此消失,不可恢复。
按范围丢弃
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 之后能找回吗?
不能。未提交过的改动不在 Git 对象库里,丢弃即永久丢失。这就是为什么 stash 是更安全的"撤销"。
Q:git checkout -- . 和 git restore . 一样吗?
一样。restore 是 Git 2.23 引入的语义更明确的新命令(checkout 身兼切分支和还原文件两职太混乱),老语法仍然兼容。
Q:为什么 git clean 默认要加 -f?
防止误删的保护:不带 -f 或 -n(预览)时 Git 拒绝执行。养成先 git clean -nd 预览的习惯。