如何检查 Git 仓库是否有未推送的提交

GitGitBeginner
立即练习

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

简介

在这个实验中,你将学习如何检查本地 Git 仓库是否有尚未推送到远程仓库的提交。我们将探索不同的方法来识别这些“未推送”的提交,首先使用基本的 git status 命令查看本地分支是否比其对应的远程分支更新。

然后,你将学习如何使用 git log @{u}..HEAD 专门列出本地存在但上游分支上没有的提交。最后,我们将简要介绍如何验证所有分支的状态,以全面了解仓库的状态。完成本实验后,你将掌握在将本地 Git 更改推送到远程之前有效管理和跟踪这些更改的基本命令。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL git(("Git")) -.-> git/BranchManagementGroup(["Branch Management"]) git(("Git")) -.-> git/BasicOperationsGroup(["Basic Operations"]) git/BasicOperationsGroup -.-> git/add("Stage Files") git/BasicOperationsGroup -.-> git/status("Check Status") git/BasicOperationsGroup -.-> git/commit("Create Commit") git/BranchManagementGroup -.-> git/log("Show Commits") subgraph Lab Skills git/add -.-> lab-560092{{"如何检查 Git 仓库是否有未推送的提交"}} git/status -.-> lab-560092{{"如何检查 Git 仓库是否有未推送的提交"}} git/commit -.-> lab-560092{{"如何检查 Git 仓库是否有未推送的提交"}} git/log -.-> lab-560092{{"如何检查 Git 仓库是否有未推送的提交"}} end

使用 git status 检查是否有未推送的提交

在这一步中,你将学习如何使用 git status 检查本地分支是否比远程分支“更新”。当你在本地进行了提交,但尚未将这些提交推送到远程仓库时,就会出现这种常见情况。

首先,确保你位于项目目录中。打开终端并导航到 my-time-machine 目录:

cd ~/project/my-time-machine

现在,创建一个新文件并添加一些内容。我们将模拟进行一次更改,最终会将其提交。

echo "This is a new line for the future." >> message.txt

此命令将文本“This is a new line for the future.”追加到之前创建的 message.txt 文件中。

接下来,使用 git add 暂存此更改:

git add message.txt

现在,创建一个新的提交,并添加一条描述更改的消息:

git commit -m "Add another message to the future"

你应该会看到类似以下的输出,表明已创建了一个新的提交:

[master a1b2c3d] Add another message to the future
 1 file changed, 1 insertion(+)

现在本地有了一个新的提交,再次使用 git status 检查仓库的状态:

git status

这次的输出会有所不同。你应该会看到类似以下的内容:

On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean

“Your branch is ahead of 'origin/master' by 1 commit.”这一行表明,本地的 master 分支有一个提交在 origin/master 分支(代表远程版本的分支)中不存在。当你在项目中工作并在与他人共享之前在本地进行更改时,这是非常常见的情况。

理解 git status 至关重要,因为它能让你清楚地了解仓库的当前状态。它会告诉你哪些文件被修改了、哪些更改已暂存,以及本地分支是否与远程分支同步。这有助于你跟踪自己的工作,并为将更改推送到远程仓库做好准备。

使用 git log @{u}..HEAD

在上一步中,我们了解到 git status 可以告知我们本地分支比远程分支更新。但如何查看哪些提交是更新的呢?这时 git log @{u}..HEAD 命令就派上用场了。

@{u}(或 @{upstream})语法指的是当前分支所跟踪的上游分支。在我们的示例中,由于没有显式设置上游分支,Git 默认使用 origin/master(假设 origin 是远程仓库的名称,master 是分支名称)。HEAD 指的是当前本地分支的最新提交。

因此,@{u}..HEAD 表示“显示当前分支(HEAD)上存在但上游分支(@{u})上不存在的提交”。

让我们在 my-time-machine 目录中尝试一下:

cd ~/project/my-time-machine
git log @{u}..HEAD

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

commit a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9 (HEAD -> master)
Author: Jane Doe <[email protected]>
Date:   Mon Aug 7 10:00:00 2023 +0000

    Add another message to the future

此输出显示了我们在上一步中刚刚创建的提交。这证实了这个特定的提交就是比远程分支“更新”的提交。

使用 git log @{u}..HEAD 是一种查看即将推送到远程仓库的具体更改的有效方法。它有助于你审查自己的工作,并确保只推送预期的提交。

请记住,你可以按 q 退出日志视图。

结合所有分支进行验证

在前面的步骤中,我们使用 git status 查看本地分支是否领先于远程分支,使用 git log @{u}..HEAD 查看具体哪些提交是领先的。现在,让我们使用 git log --all --decorate --oneline --graph 来可视化所有分支的提交历史,这有助于你理解本地分支和远程分支之间的关系。

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

cd ~/project/my-time-machine

现在,运行以下命令:

git log --all --decorate --oneline --graph

让我们来拆解一下这些选项:

  • --all:显示所有分支的历史记录。
  • --decorate:在提交旁边显示分支和标签名称。
  • --oneline:将每个提交显示在一行上。
  • --graph:在输出的左侧绘制基于文本的提交历史图形表示。

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

* a1b2c3d (HEAD -> master) Add another message to the future
* e4f5g6h (origin/master) Send a message to the future

在这个输出中:

  • 第一行显示了我们最新的提交 (a1b2c3d),提交信息为“Add another message to the future”。(HEAD -> master) 表示当前的 HEAD(即你当前工作的位置)和本地的 master 分支都指向这个提交。
  • 下面一行显示了之前的提交 (e4f5g6h),提交信息为“Send a message to the future”。(origin/master) 表示 origin/master 分支(远程跟踪分支)指向这个提交。

左侧的图形(* 和线条)直观地显示了本地的 master 分支比 origin/master 分支多了一个提交。这证实了之前 git status 所显示的信息。

这个命令对于可视化仓库的历史记录非常有用,尤其是当你有多个分支时。它能帮助你理解分支是如何分叉和合并的,以及本地分支相对于远程分支的位置。

q 退出日志视图。

总结

在本次实验中,我们学习了如何检查 Git 仓库是否有未推送的提交。首先,我们使用 git status 来确定本地分支是否比远程分支“更新”。这包括导航到项目目录、创建并暂存一个新文件,以及提交更改。提交后,再次运行 git status 可以清楚地看到,本地分支比远程分支多了一个提交,这表明存在未推送的更改。

本次实验展示了 git status 在识别未推送提交方面的实际应用,强调了它在了解本地仓库和远程仓库同步状态方面的重要性。