撤销暂存区的修改
Git撤销暂存区文件(git restore --staged用法)
#tech / ops / git
#type / howto
#status / evergreen
撤销暂存区的修改
情境
当你执行了 git add . 将所有修改放入暂存区(Staging Area),但随后发现有些文件不应该被提交(比如配置文件、临时日志),或者想把暂存区清空重新整理时,可以使用以下方法。
方法
根据你的 Git 版本和具体需求,有两种主要方式。
方式一:使用 git restore (推荐,Git 2.23+ 版本)
这是目前最语义化、最清晰的命令。它专门用于恢复文件状态。
-
撤销所有文件的暂存(相当于撤销
git add .):git restore --staged . -
撤销特定文件的暂存:
git restore --staged <文件名>
注意: 加上
--staged参数非常重要。这表示只把文件从“暂存区”移出来,放回“工作区”。你的代码修改仍然保留,不会丢失。
方式二:使用 git reset (经典通用方法)
在旧版本 Git 或习惯旧命令的开发者中常用的方法。
-
撤销所有文件的暂存:
git reset HEAD . # 或者简写为 git reset -
撤销特定文件的暂存:
git reset HEAD <文件名>
知识
为了更好地理解上述命令,我们需要理清 Git 的三个核心区域以及数据流向。
1. Git 的三个核心区域
| 区域名称 | 英文 | 描述 |
|---|---|---|
| 工作区 | Working Directory | 你当前写代码、编辑文件的地方。文件通常显示为红色(Modified)。 |
| 暂存区 | Staging Area / Index | 一个“待提交清单”。git add 将文件放这里。文件通常显示为绿色(Staged)。 |
| 版本库 | Repository | 历史记录仓库。git commit 将暂存区的内容永久保存到这里。 |
2. 操作流向图
git add: 工作区 $\rightarrow$ 暂存区git restore --staged(或git reset): 暂存区 $\rightarrow$ 工作区 (这就是你现在做的)
3. 为什么推荐 git restore?
在早期的 Git 中,git checkout 和 git reset 承担了太多的功能(既能切换分支,又能撤销文件,还能移动 HEAD 指针),容易让人混淆。
从 Git 2.23 版本开始,官方引入了两个新命令来拆分职责:
git switch:专门用于切换分支。git restore:专门用于恢复/撤销文件修改。
4. ⚠️ 关键区别:撤销“暂存” vs 撤销“修改”
请务必区分以下两个命令的区别,避免数据丢失:
git restore --staged <file>:安全。仅将文件移出暂存区,保留你写的代码。git restore <file>(没有--staged):危险。这将丢弃你在工作区的所有修改,文件会回退到上一次 commit 的状态(你的代码会消失)。
你可以帮我做个选择:
你是因为如果不小心 add 了不想提交的配置文件,还是只是想把所有文件退出来重新分批提交?如果是配置文件,需要我教你如何配置 .gitignore 来永久忽略它吗?