如何检查 Git 分支是否有未推送的提交

GitGitBeginner
立即练习

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

简介

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

然后,你将学习如何使用带有特定参数的 git log 命令来列出本地存在但远程跟踪分支上没有的提交。最后,我们将讨论如何通过比较本地分支和远程仓库来验证这些信息。在本次实验结束时,你将掌握轻松确定本地更改是否需要推送的技能。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL git(("Git")) -.-> git/BranchManagementGroup(["Branch Management"]) git(("Git")) -.-> git/CollaborationandSharingGroup(["Collaboration and Sharing"]) 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") git/CollaborationandSharingGroup -.-> git/push("Update Remote") subgraph Lab Skills git/add -.-> lab-560040{{"如何检查 Git 分支是否有未推送的提交"}} git/status -.-> lab-560040{{"如何检查 Git 分支是否有未推送的提交"}} git/commit -.-> lab-560040{{"如何检查 Git 分支是否有未推送的提交"}} git/log -.-> lab-560040{{"如何检查 Git 分支是否有未推送的提交"}} git/push -.-> lab-560040{{"如何检查 Git 分支是否有未推送的提交"}} end

使用 git status 检查领先的提交

在这一步中,你将学习如何使用 git status 命令来查看本地分支是否有领先于远程分支的提交。当你在本地进行了更改但尚未将其推送到远程仓库时,这是一种常见的情况。

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

cd ~/project/my-time-machine

现在,创建一个新文件并添加一些内容。将这个文件命名为 future_plans.txt

echo "Plan for world domination." > future_plans.txt

接下来,需要将这个新文件暂存(stage)起来,为提交做准备:

git add future_plans.txt

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

git commit -m "Add future plans"

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

[master abcdefg] Add future plans
 1 file changed, 1 insertion(+)
 create mode 100644 future_plans.txt

现在,你已经在本地的 master 分支上创建了一个新的提交。但是,这个提交仅存在于本地,尚未发送到任何远程仓库。

使用 git status 查看仓库的当前状态:

git status

输出现在应该显示你的本地分支领先于远程分支(如果你配置了远程分支的话,在这个基础示例中我们没有配置,但 Git 仍然会给出提示):

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

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

nothing to commit, working tree clean

这里重要的一行是 Your branch is ahead of 'origin/master' by 1 commit.。这表明本地的 master 分支有一个提交是 origin/master 分支(这是 Git 预期的远程分支的默认名称)上所没有的。

这是一条非常有用的信息。它让你知道本地有尚未与他人共享的更改。在有远程仓库的实际场景中,这意味着你需要使用 git push 推送你的更改。

运行 git log --oneline @{u}..HEAD

在上一步中,你已经了解了如何使用 git status 命令判断本地分支是否领先于远程分支。现在,你将使用带有特殊语法的 git log 命令,来确切地查看哪些提交是领先的。

确保你仍然位于 ~/project/my-time-machine 目录中。

你将使用的命令是 git log --oneline @{u}..HEAD。下面来拆解这个命令:

  • git log:这是用于查看提交历史的命令。
  • --oneline:此选项会将每个提交显示在一行上,使输出简洁易读。
  • @{u}:这是一种特殊语法,指的是上游分支(upstream branch)。在这个例子中,由于你没有显式设置上游分支,Git 默认使用 origin/master(假设 origin 是远程仓库的名称,master 是分支名称)。
  • ..HEAD:这是一个范围表示法。HEAD 指的是当前分支(本地的 master 分支)的最新提交。@{u}..HEAD 这个范围表示“显示从 HEAD 可达但从 @{u} 不可达的提交”。简单来说,它会显示本地分支上有但上游远程分支上没有的提交。

现在,运行这个命令:

git log --oneline @{u}..HEAD

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

abcdefg (HEAD -> master) Add future plans

这个输出显示了你在上一步中创建的提交(Add future plans)。唯一标识符(abcdefg)在你的终端中可能会有所不同,但提交消息应该是匹配的。

这个命令对于确切了解你即将推送到远程仓库的提交非常有用。它会清晰地列出你在本地所做的尚未共享的更改。

将这个输出与上一步的 git status 输出进行比较,你会发现 git status 告诉你领先了多少个提交,而 git log @{u}..HEAD 则告诉你具体是哪些提交领先。这两个命令都能提供关于本地仓库相对于其远程对应仓库状态的有价值信息。

通过远程比较进行验证

在实际场景中,你的本地仓库通常会连接到一个远程仓库(如 GitHub、GitLab 或 Bitbucket 上的仓库)。在这个实验环境中,没有可供推送的实时远程仓库。不过,你可以使用已经学过的命令来模拟将本地分支与远程分支进行比较的过程。

你已经使用 git statusgit log --oneline @{u}..HEAD 查看了本地分支上有但模拟的上游分支(origin/master)上没有的提交。

让我们再次查看 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)

... (rest of the output)

以及 git log --oneline @{u}..HEAD 的输出:

git log --oneline @{u}..HEAD

这应该会显示你所做的单个提交:

abcdefg (HEAD -> master) Add future plans

这两个命令协同工作,能让你清晰地了解本地分支与其配置的上游分支之间的差异。git status 提供了一个概要,而 git log @{u}..HEAD 则提供了具体提交的详细信息。

在实际项目中,看到这些输出后,你通常会运行 git push 命令,将本地提交发送到远程仓库,使其他人能够访问这些提交并更新远程分支。

由于在这个实验中没有可推送的远程仓库,你已经成功达成了使用 git statusgit log 识别领先于远程分支的提交这一目标。

这项技能对于与他人协作以及保持本地和远程仓库的同步至关重要。通过定期检查状态和日志,你可以随时了解待处理的更改,并在准备好时将它们推送出去。

总结

在这个实验中,你学习了如何检查 Git 分支是否有未推送的提交。在进行本地提交后,你首先使用了 git status 命令。git status 的输出会明确指出本地分支是否比其对应的远程分支“领先”,以及领先了多少个提交,这为查看是否有未推送的更改提供了直接的方法。

接着,你探索了使用 git log --oneline @{u}..HEAD 命令,以更详细地查看本地分支上有但远程跟踪分支上没有的具体提交。这个命令会列出未推送提交的哈希值和提交信息,为识别待处理的更改提供了精确的方法。最后,你讨论了通过比较本地分支和远程分支来验证这一点的概念,加深了对如何确认存在未推送提交的理解。