git checkout -- 用于丢弃已跟踪文件在工作区的未暂存修改,不改变暂存区;若文件已暂存,需先git reset head 再执行该命令。

git checkout -- file 放弃单个文件的修改
工作区有未暂存的改动,想直接丢掉,用 git checkout -- <file></file> 最直接。注意双横线不能省,否则命令会变成切换分支。这个操作只影响工作区,不影响暂存区;如果文件已经 git add 过,它不会撤回暂存状态,得先 git reset HEAD <file></file> 再用 checkout。
- 修改了
src/main.js但还没add:运行git checkout -- src/main.js即可还原 - 文件已
add但没commit:先git reset HEAD src/main.js,再git checkout -- src/main.js - 想批量还原多个文件:写成
git checkout -- src/ utils/ README.md,空格分隔路径
git restore . 一键放弃所有未暂存修改(Git 2.23+)
git restore 是 Git 2.23 引入的更语义化命令,替代了过去容易混淆的 git checkout --。对当前目录下所有未暂存的修改,执行 git restore . 即可清空。它默认只作用于工作区,不碰暂存区——这点比老命令更安全、意图更明确。
-
git restore .:放弃当前目录及子目录所有未暂存改动 -
git restore --staged .:只取消暂存(相当于git reset),保留工作区修改 -
git restore -s HEAD .:从最近一次 commit 恢复(等价于git checkout HEAD -- .)
旧版本 Git(restore,强行使用会报错 unknown subcommand 'restore',此时必须退回 checkout -- 或升级 Git。
git reset --hard HEAD 彻底放弃所有本地改动(含暂存区)
这个命令会同时清空暂存区和工作区,把整个工作目录退回到上一次 commit 的状态。它不可逆,且会删除所有未提交的变更,包括已 add 但未 commit 的内容。
- 执行前务必确认没有需要保留的改动,尤其注意
.env、node_modules/等被忽略但可能有本地修改的文件 - 如果只是想撤销某次
add而保留编辑,别用这个,改用git reset HEAD <file></file> - 若误操作导致重要修改丢失,可尝试从 reflog 恢复:
git reflog找到操作前的HEAD@{n},再git reset --hard HEAD@{n}
为什么 git checkout -- file 有时没反应?
常见原因不是命令写错,而是文件状态不符合预期:
- 文件根本没被 Git 跟踪(
git status显示为untracked):此时checkout --无效,Git 不知道该还原成什么版本,得手动删或用git clean -f - 当前分支 HEAD 指向的 commit 中根本没有这个文件:比如刚新建的文件,之前从未
commit过,checkout --会报错pathspec 'xxx' did not match any file(s) known to git - 文件被
.gitignore忽略:Git 默认不管理它,自然也无法通过checkout恢复
真正要放弃的,永远是“已被 Git 跟踪且有变更”的文件;其他情况得换思路处理。











