如何检查 Git 仓库是否有未提交的更改

GitGitBeginner
立即练习

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

简介

在这个实验中,你将学习如何检查 Git 仓库中的未提交更改。我们将探讨重要的 git status 命令,以查看工作目录的整体状态和暂存的更改。

此外,你将了解如何使用 git diff 命令来检查文件的具体修改,从而在提交之前确切地了解哪些内容发生了变化。最后,我们将简要介绍如何同时检查暂存和未暂存的更改。


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-560091{{"如何检查 Git 仓库是否有未提交的更改"}} git/status -.-> lab-560091{{"如何检查 Git 仓库是否有未提交的更改"}} git/diff -.-> lab-560091{{"如何检查 Git 仓库是否有未提交的更改"}} end

运行 git status 查看更改

在这一步中,你将学习如何使用 git status 命令来查看 Git 仓库的当前状态。在使用 Git 时,这个命令是你的好帮手,因为它能准确地告诉你当前的情况。

首先,确保你位于 my-time-machine 目录中。你可以通过输入以下命令来实现:

cd ~/project/my-time-machine

现在,让我们运行 git status 命令:

git status

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

On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean

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

  • On branch master:这表明你当前位于 master 分支上。分支就像是项目中的不同时间线。
  • Your branch is up to date with 'origin/master':这意味着你的本地 master 分支与远程的 origin/master 分支是同步的(我们稍后会详细了解远程仓库)。
  • nothing to commit, working tree clean:这是理想状态!这意味着你的项目中没有未保存(提交)到 Git 历史记录中的更改。

git status 命令非常重要,因为它能帮助你了解哪些文件被修改了、哪些是新的且未被跟踪的,以及哪些更改准备好提交了。在对项目进行任何更改后,你应该首先运行这个命令,以了解 Git 是如何看待这些更改的。

使用 git diff 检查修改

在这一步中,你将学习如何使用 git diff 命令来查看文件中所做的具体更改。git status 会告诉你哪些文件发生了更改,而 git diff 则会显示这些文件中具体的更改内容。

首先,让我们对 message.txt 文件进行修改。确保你仍处于 ~/project/my-time-machine 目录中。

使用 nano 编辑器打开该文件:

nano message.txt

在文件中添加一行新内容,例如:

Hello, Future Me
This is a new line.

Ctrl + X 退出,然后按 Y 保存,再按 Enter 确认文件名。

现在我们已经修改了文件,让我们使用 git status 查看 Git 是如何识别这个更改的:

git status

你应该会看到输出表明 message.txt 已被修改:

On branch master
Your branch is up to date with 'origin/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 已被 modified(修改),并且这些更改 not staged for commit(未暂存以进行提交)。这意味着我们已经修改了文件,但还没有告诉 Git 准备将这些更改提交。

现在,让我们使用 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
+This is a new line.

让我们来理解这个输出:

  • ---+++ 开头的行分别显示原始文件 (a/message.txt) 和新文件 (b/message.txt)。
  • @@ 开头的行称为“hunk 头”。它显示了文件中更改的位置。-1 +1,2 表示从原始文件的第 1 行开始,删除了 1 行,从新文件的第 1 行开始,添加了 2 行。
  • - 开头的行显示被删除的行。
  • + 开头的行显示被添加的行。

在我们的例子中,我们添加了一行,所以你会看到以 + 开头的行。

git diff 命令在暂存或提交更改之前查看修改内容时非常有用。它可以帮助你发现错误,并确保你只将预期的修改包含在提交中。

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

结合暂存和未暂存更改检查

在这一步中,你将了解 Git 如何处理暂存和未暂存的更改,以及如何使用 git diff 命令来检查这些更改。

回顾上一步,我们修改了 message.txt 文件,但没有将更改暂存。现在,让我们使用 git add 命令将更改暂存:

git add message.txt

现在,再次运行 git status 命令:

git status

输出应该显示更改现在已被暂存:

On branch master
Your branch is up to date with 'origin/master'.

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

Git 现在显示 Changes to be committed,这表明对 message.txt 的修改已进入暂存区,准备进行下一次提交。

如果我们现在运行 git diff 命令,会发生什么呢?

git diff

你可能会惊讶地发现没有输出。这是因为 git diff 默认显示的是工作目录和暂存区之间的差异。由于我们工作目录中的更改现在与暂存区中的更改相同(因为我们刚刚添加了这些更改),所以没有差异可显示。

要查看暂存区和上一次提交之间的差异,我们需要使用 git diff 命令的另一种形式:

git diff --staged

或者,等效地:

git diff --cached

这两个命令的作用相同。让我们运行它:

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
+This is a new line.

这显示了我们所做的具体更改:添加了 "This is a new line." 这一行。

理解 git diff(工作目录与暂存区)和 git diff --staged(暂存区与上一次提交)之间的区别,是有效使用 Git 的基础。这能让你在进行永久性提交之前,仔细审查不同阶段的更改。

总结

在本次实验中,你学习了如何检查 Git 仓库中的未提交更改。首先,你使用 git status 命令来了解仓库的整体状态,包括当前分支以及是否存在修改、新增或未跟踪的文件。这个命令对于了解存在哪些更改至关重要。

接下来,你探索了 git diff 命令,以检查文件内所做的具体修改。git status 会告诉你哪些文件发生了更改,而 git diff 则会显示逐行的具体差异,让你在暂存或提交更改之前能够审查更改的内容。