推荐用 git restore --staged 撤销暂存:git restore --staged README.md 或 git restore --staged .,可安全取消 add 且保留工作区修改;等价旧写法为 git reset HEAD,但 git checkout -- 和 git reset --hard 会丢失代码,切勿误用。
已执行 git add 把修改加入暂存区,但还没 commit,这时撤销只需“把暂存区还原”,工作区文件内容保留不变——这是最常见也最安全的场景。
推荐用 git restore --staged
Git 2.23+(macOS 上 Homebrew 安装的 Git 通常已是新版)官方明确推荐此命令,语义清晰、无副作用:
- 撤销单个文件:`git restore --staged README.md`
- 撤销当前目录所有暂存文件:`git restore --staged .`(注意点号前加空格,避免 shell 展开)
- 撤销指定目录下所有暂存文件:`git restore --staged src/ tests/`
- 交互式部分撤销(如只撤回某几行):`git restore --staged --patch README.md`
执行后,文件从“暂存的更改”列表移回“更改”列表,内容毫发无损,适合改完代码又想再调一调的情况。
兼容写法:git reset HEAD
老版本 Git 或习惯命令行的用户仍常用它,效果等价但稍需留意:
- 撤销单个文件:`git reset HEAD README.md`
- 撤销全部暂存文件:`git reset HEAD`(不带路径)
⚠️ 注意:若该文件是全新创建、从未提交过,git reset HEAD <file> 会报错“pathspec did not match any files”。此时只能用 git restore --staged 或 git rm --cached(后者本意是停止跟踪,慎用)。
VS Code 里点错“暂存”?直接右键解决
在 VS Code 源代码管理面板中:
- 在“暂存的更改”区域右键某文件 → 选“撤销暂存更改”,等效于
git restore --staged - 快捷键:选中已暂存文件后按 Option + Delete(macOS)
- 批量撤销:点击“暂存的更改”标题旁的 ⋯ → “撤销所有暂存的更改”
别误点顶部弹出的“放弃更改”横幅——那是丢弃工作区修改,不是取消暂存。
哪些命令千万别乱用
以下两个常被误当作“取消暂存”的命令,实际作用完全不同:
-
git checkout -- <file>:用暂存区内容覆盖工作区 → 你刚写的代码直接消失 -
git reset --hard:同时重置暂存区和工作区 → 所有未提交修改全丢,不可逆
它们不是为取消暂存设计的,误用等于删代码。真要丢弃修改,请先确认是否已备份或 stash。


















