如何检查 Git 仓库是否有已暂存的更改

GitGitBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在这个实验中,你将学习如何检查 Git 仓库是否有已暂存的更改。你将使用 git status 命令查看已暂存的文件,并理解其输出,该输出会显示仓库的当前状态,包括已修改、已暂存和未跟踪的文件。

此外,你将探索如何使用 git diff --cached 来检查当前暂存区中的具体更改,从而验证仓库中已暂存和未暂存更改之间的差异。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL git(("Git")) -.-> git/BasicOperationsGroup(["Basic Operations"]) git/BasicOperationsGroup -.-> git/add("Stage Files") git/BasicOperationsGroup -.-> git/status("Check Status") git/BasicOperationsGroup -.-> git/diff("Compare Changes") subgraph Lab Skills git/add -.-> lab-560089{{"如何检查 Git 仓库是否有已暂存的更改"}} git/status -.-> lab-560089{{"如何检查 Git 仓库是否有已暂存的更改"}} git/diff -.-> lab-560089{{"如何检查 Git 仓库是否有已暂存的更改"}} end

使用 git status 查看已暂存的文件

在这一步中,我们将再次使用 git status 命令,来查看在添加文件后 Git 是如何跟踪更改的。

首先,确保你位于 my-time-machine 目录中。如果不在,请使用 cd 命令:

cd ~/project/my-time-machine

现在,让我们创建一个名为 notes.txt 的新文件,并向其中添加一些内容:

echo "Ideas for the future" > notes.txt

此命令会创建包含指定文本的 notes.txt 文件。

接下来,让我们告诉 Git 我们要跟踪这个新文件。为此,我们使用 git add 命令:

git add notes.txt

此命令将 notes.txt 添加到暂存区。暂存区就像是更改在提交之前的“候诊室”。

现在,让我们使用 git status 检查仓库的状态:

git status

你应该会看到类似于以下的输出:

On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        new file:   notes.txt

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        message.txt

注意,现在的输出在“Changes to be committed”下列出了 notes.txt。这意味着该文件已在暂存区中,准备包含在下一次提交中。

你可能还会看到 message.txt 列在“Untracked files”下。这是因为在前面的步骤中,我们还没有提交对 message.txt 的更改。Git 向我们显示,工作目录中仍有未被跟踪以用于 下一次 提交的更改。

理解 git status 的输出至关重要。它会告诉你仓库的当前状态,显示哪些文件已被修改、哪些已暂存待提交,以及哪些是未跟踪的。这有助于你跟踪自己的工作,并决定在下一个保存点中包含哪些内容。

使用 git diff --cached 检查更改

在这一步中,你将学习如何使用 git diff --cached 命令查看当前暂存区中的具体更改。

回顾上一步,我们已将 notes.txt 添加到了暂存区。现在,让我们看看 Git 准备提交哪些更改。

确保你位于 ~/project/my-time-machine 目录中:

cd ~/project/my-time-machine

现在,运行以下命令:

git diff --cached

你应该会看到类似于以下的输出:

diff --git a/notes.txt b/notes.txt
new file mode 100644
index 0000000..a1b2c3d
--- /dev/null
+++ b/notes.txt
@@ -0,0 +1 @@
+Ideas for the future

此输出显示了暂存区与上一次提交之间的差异。由于这是我们首次将 notes.txt 暂存,Git 将其显示为新文件。

让我们详细分析一下输出内容:

  • diff --git a/notes.txt b/notes.txt:这一行表明我们正在比较 notes.txt 文件的两个版本。
  • new file mode 100644:这表明 notes.txt 是一个新文件。
  • index 0000000..a1b2c3d:这些是 Git 内部用于标识文件内容的标识符。
  • --- /dev/null:这代表文件添加之前的“空”状态。
  • +++ b/notes.txt:这代表文件在暂存区中的当前状态。
  • @@ -0,0 +1 @@:这是一个头部信息,指示发生更改的行。-0,0 表示原始(空)状态下没有行,+1 表示新状态下添加了一行。
  • +Ideas for the future:加号 + 表示这一行是新增的。

git diff --cached 命令在提交暂存更改之前查看这些更改时非常有用。它能让你仔细检查即将保存到项目历史记录中的具体内容,有助于避免意外提交不需要的更改。

q 键退出差异视图并返回命令行。

验证已暂存和未暂存的更改

在这一步中,你将通过修改一个已被 Git 跟踪的文件,进一步探究已暂存和未暂存更改之间的区别。

首先,确保你位于 ~/project/my-time-machine 目录中:

cd ~/project/my-time-machine

现在,让我们在 notes.txt 文件中再添加一行内容。你可以使用带有 >>echo 命令将文本追加到现有文件中:

echo "Another idea" >> notes.txt

此命令会将 "Another idea" 这一行添加到 notes.txt 文件的末尾。

让我们再次检查仓库的状态:

git status

你应该会看到类似于以下的输出:

On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        new file:   notes.txt

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   notes.txt

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        message.txt

注意,notes.txt 现在出现在两个部分中:

  1. Changes to be committed(待提交的更改):这指的是我们在上一步添加到暂存区的 notes.txt 版本(仅包含 "Ideas for the future")。
  2. Changes not staged for commit(未暂存的更改):这指的是我们刚刚对 notes.txt 所做的更改(添加了 "Another idea")。这些更改位于你的工作目录中,但尚未添加到暂存区。

这是 Git 中的一个关键概念:暂存区保存着准备用于 下一次 提交的更改快照,而工作目录包含文件的当前状态,其中包括尚未暂存的更改。

若要查看工作目录和暂存区之间的差异,你可以不使用任何选项直接使用 git diff 命令:

git diff

这将显示 暂存的更改。你应该会看到显示添加了 "Another idea" 这一行的输出。

若要查看暂存区和上一次提交之间的差异(我们在上一步中已经看过),你可以使用 git diff --cached 命令。

理解已暂存和未暂存更改之间的区别,以及如何使用 git statusgit diff 查看这些更改,是有效使用 Git 的基础。它能让你精确控制每次提交中包含的内容。

总结

在本次实验中,你学习了如何检查 Git 仓库是否有已暂存的更改。首先,你使用 git status 命令查看了仓库的当前状态,包括已添加到暂存区的文件。你了解到 git status 能清晰地指出哪些文件属于“待提交的更改”。

接着,你探究了 git diff --cached 命令,该命令可专门用于查看已暂存的更改与上一次提交之间的差异。这让你能够看到准备提交的具体内容修改。最后,你强化了对已暂存和未暂存更改之间区别的理解,明白 git status 提供了一个总体概述,而 git diff --cached 则展示了已暂存更改的详细内容。