跳转至

Git 暂存区(Staged)Diff 查看与操作指南

在 Git 中,理解 工作区(Working Directory)暂存区(Staging Area / Index)提交区(Repository/HEAD) 的关系很重要。本页专注于如何查看和操作暂存区(Staged),并提供常用示例与技巧,适合直接放到 MkDocs 文档中。


1. 基本概念

  • 工作区(Working Directory):你当前编辑的文件所在位置。
  • 暂存区(Staging Area / Index):通过 git add 把修改放入的区域,用来准备提交。
  • 提交区(Repository / HEAD):已经保存到历史版本中的内容。

一个常见的误解是:git add 并不是直接提交,而是把修改放到暂存区;提交动作需要再执行 git commit


2. 查看暂存区差异

  • git diff:显示 工作区 vs 暂存区 的差异(未 git add 的改动)。
  • git diff --cachedgit diff --staged:显示 暂存区 vs 上一次提交(HEAD) 的差异(也就是所有已 git add 的改动)。

3. 常用命令(可直接复制运行)

查看所有已 staged 的改动(批量):

1
2
3
git diff --cached
# 等价命令
git diff --staged

查看单个文件的 staged diff:

git diff --cached path/to/file.ext

只列出已 staged 的文件名(不显示内容):

git diff --cached --name-only

列出已 staged 文件及状态(M=modified, A=added, D=deleted):

git diff --cached --name-status

查看统计信息(每个文件的改动行数汇总):

git diff --cached --stat

把 staged 改动保存为补丁文件(便于发送/审核/应用):

git diff --cached > staged-changes.patch

4. Git 暂存区(Staged)的常用操作和命令举例

暂存区是 Git 使用的一个难点,因为它处于 工作区和提交区之间,操作灵活但容易混淆。下面是常见的操作和示例:

4.1 将修改加入暂存区

git add file1.txt file2.js

添加当前目录下的所有修改:

git add .

添加仓库中所有修改(更推荐明确路径,而非 -A):

git add -A

4.2 从暂存区移除文件(但保留工作区修改)

git reset HEAD file1.txt

此时修改仍然存在于工作区,只是从暂存区移除了。


4.3 暂存部分修改(交互式)

git add -p file1.txt

这会逐块(hunk)显示修改,你可以选择 y(加入)、n(跳过)等操作。


4.4 查看暂存区内容

git diff --cached

列出已暂存文件:

git diff --cached --name-only

4.5 从暂存区移除文件(不跟踪)

git rm --cached file1.txt

这会把文件从暂存区和版本库中移除,但不会删除工作区的文件。


4.6 清空暂存区(保留工作区修改)

git reset

这样会把暂存区的内容回退到上一次提交的状态,修改仍然保留在工作区。


4.7 暂存区与提交结合

提交暂存区的内容:

git commit -m "Add new feature"

跳过暂存区,直接提交工作区的所有修改(不推荐长期使用):

git commit -a -m "Quick commit"

5. 实用技巧

  • 使用 git status 随时查看哪些修改在工作区,哪些在暂存区。
  • 如果提交前需要更精细的控制,推荐使用 git add -p
  • 当暂存区和工作区同时有修改时,可以用 git diff(看未暂存改动) + git diff --cached(看已暂存改动)结合分析。
  • 如果不小心提交了错误内容,可以用 git reset --softgit reset --mixed 回退并重新整理暂存区。

6. 小结(速查表)

场景 命令
添加文件到暂存区 git add file
添加所有修改 git add .
移除文件出暂存区(保留工作区修改) git reset HEAD file
交互式选择修改块加入暂存区 git add -p
清空暂存区(保留工作区修改) git reset
查看工作区未暂存的改动 git diff
查看所有已 staged 的改动 git diff --cached
提交暂存区内容 git commit -m "msg"

7. 常见问题(FAQ)

Q:为什么说暂存区是 Git 使用的难点?
A:因为 Git 提交分两步:先 git add 放入暂存区,再 git commit。这给了用户高度的灵活性(可以只提交部分修改),但也容易搞混“修改是否已经准备提交”。掌握 git diffgit status,是理解和正确使用暂存区的关键。