如何检查 Git 中文件是否有更改

GitBeginner
立即练习

介绍

在这个实验中,你将学习如何检查 Git 仓库中的更改。我们将探索重要的 Git 命令 git statusgit diff,以识别修改过的文件并查看对这些文件所做的具体更改。

通过实践练习,你将练习使用 git status 查看哪些文件已被更改,使用 git diff 查看文件当前状态与最后一次提交版本之间的逐行差异。你还将学习 Git 如何指示未更改的文件。

运行 git status 查看已修改文件

在这一步中,你将学习如何使用 git status 查看项目中所做的更改。

首先,确保你位于项目目录中。打开终端并输入:

cd ~/project/my-time-machine

现在,创建一个新文件。我们将在 message.txt 文件中添加一行简单的内容:

echo "P.S. Hope you're doing well!" >> message.txt

>> 符号将文本追加到现有文件中,而不是覆盖它。

检查文件内容以确认更改:

cat message.txt

你应该会看到:

Hello, Future Me
P.S. Hope you're doing well!

现在,看看 Git 如何识别这个更改。运行 git status 命令:

git status

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

On branch master
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:   message.txt

no changes added to commit (use "git add" and/or "git commit -a")

Git 提示 message.txt 已被“修改”。这意味着 Git 知道自上次提交以来该文件已发生更改,但这些更改尚未添加到暂存区。

理解 git status 至关重要,因为它能告诉你工作目录和暂存区的当前状态。它是你了解所做更改以及哪些更改准备好提交的主要工具。

使用 git diff 检查更改

在上一步中,我们了解到 git status 可以告诉我们哪些文件被修改了。但如果你想确切地知道做了哪些更改呢?这就是 git diff 发挥作用的地方!

git diff 可以显示你的工作目录与最后一次提交(或者暂存区,具体取决于你的使用方式)之间的差异。这就像是将文件的当前版本与上一个保存点的版本进行比较。

让我们来试试看。确保你仍然在 ~/project/my-time-machine 目录中,然后运行:

git diff

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

diff --git a/message.txt b/message.txt
index a1b2c3d..e4f5g6h 100644
--- a/message.txt
+++ b/message.txt
@@ -1 +1,2 @@
 Hello, Future Me
+P.S. Hope you're doing well!

让我们来详细分析一下这个输出:

  • diff --git a/message.txt b/message.txt:这一行表明 Git 正在比较 message.txt 文件的两个版本。
  • index a1b2c3d..e4f5g6h 100644:这是关于文件版本的技术信息。
  • --- a/message.txt:这表示文件的原始版本(在你进行更改之前)。
  • +++ b/message.txt:这表示文件的新版本(包含你的更改)。
  • @@ -1 +1,2 @@:这被称为“块头”(hunk header)。它告诉你更改在文件中的位置。-1 表示从第 1 行开始(在原始文件中)有 1 行被删除,而 +1,2 表示从第 1 行开始(在新文件中)有 2 行。
  • +P.S. Hope you're doing well!:以 + 开头的行表示新增的行。如果你删除了一行,它将以 - 开头。

git diff 是一个非常强大的工具。在提交更改之前,运行 git diff 来仔细查看你即将保存的内容总是一个好主意。这有助于避免意外提交不需要的更改。

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

测试未更改的文件

在前面的步骤中,我们了解了文件被修改时 git statusgit diff 的工作原理。但如果在没有任何更改的情况下运行这些命令,会发生什么呢?

让我们一探究竟!确保你位于 ~/project/my-time-machine 目录中。

首先,运行 git status

git status

由于自上次检查状态以来我们没有做任何更改,你应该会看到与之前相同的输出,表明 message.txt 已被修改但尚未暂存:

On branch master
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:   message.txt

no changes added to commit (use "git add" and/or "git commit -a")

现在,再次尝试运行 git diff

git diff

你应该会看到与之前相同的差异输出,显示当前文件与最后一次提交之间的差异:

diff --git a/message.txt b/message.txt
index a1b2c3d..e4f5g6h 100644
--- a/message.txt
+++ b/message.txt
@@ -1 +1,2 @@
 Hello, Future Me
+P.S. Hope you're doing well!

这证实了无论你在没有进一步更改的情况下运行这些命令多少次,git statusgit diff 都会显示你的工作目录相对于最后一次提交的当前状态。

现在,使用 git add 将我们对 message.txt 所做的更改暂存起来:

git add message.txt

再次运行 git status

git status

输出将会改变,显示这些更改现在已被暂存:

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

注意,git status 现在显示“Changes to be committed”。这意味着这些更改已在暂存区中,准备进行下一次提交。

现在 git diff 会怎样呢?让我们试试看:

git diff

这次,git diff 将不会有任何输出。为什么呢?因为当你不带任何参数运行 git diff 时,它会将你的工作目录与 暂存区 进行比较。由于我们刚刚将更改添加到了暂存区,工作目录和暂存区是相同的。

要查看暂存区与最后一次提交之间的差异,你可以使用 git diff --staged。让我们试试看:

git diff --staged

这将显示当前暂存区中更改的差异,也就是我们添加的那一行:

diff --git a/message.txt b/message.txt
index a1b2c3d..e4f5g6h 100644
--- a/message.txt
+++ b/message.txt
@@ -1 +1,2 @@
 Hello, Future Me
+P.S. Hope you're doing well!

理解 git diff(工作目录与暂存区)和 git diff --staged(暂存区与最后一次提交)之间的区别是 Git 中的一个关键概念。它有助于你在提交更改之前管理这些更改。

如果差异视图出现,按 q 退出。

总结

在本次实验中,我们学习了如何检查 Git 仓库中的更改。首先,我们使用 git status 来确定自上次提交以来工作目录中哪些文件被修改了。该命令会提供仓库当前状态的摘要,指出已修改、已暂存和未跟踪的文件。

接下来,我们探索了 git diff 命令,以检查修改文件内的具体更改。此命令会逐行比较工作目录中文件的当前版本和最后一次提交中的版本,突出显示新增和删除的内容。最后,我们证实了当仓库中的文件没有任何修改时,git status 会正确报告没有更改。