撤销暂存区的修改

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 checkoutgit reset 承担了太多的功能(既能切换分支,又能撤销文件,还能移动 HEAD 指针),容易让人混淆。

从 Git 2.23 版本开始,官方引入了两个新命令来拆分职责:

  • git switch:专门用于切换分支。
  • git restore:专门用于恢复/撤销文件修改。

4. ⚠️ 关键区别:撤销“暂存” vs 撤销“修改”

请务必区分以下两个命令的区别,避免数据丢失:

  • git restore --staged <file>安全。仅将文件移出暂存区,保留你写的代码。
  • git restore <file> (没有 --staged):危险。这将丢弃你在工作区的所有修改,文件会回退到上一次 commit 的状态(你的代码会消失)。

你可以帮我做个选择:

你是因为如果不小心 add 了不想提交的配置文件,还是只是想把所有文件退出来重新分批提交?如果是配置文件,需要我教你如何配置 .gitignore 来永久忽略它吗?

创建于 2025/1/1 更新于 2026/5/27