如何检查 Git 分支是否落后于远程分支

GitGitBeginner
立即练习

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

简介

在这个实验中,你将学习如何判断本地 Git 分支是否落后于对应的远程分支。我们将介绍实现这一目标的关键步骤,首先是使用 git fetch 从远程仓库获取最新更改。

获取更改后,你将使用 git status 快速检查你的分支是否落后于远程分支。最后,你将学习如何使用 git log HEAD..@{u} 查看存在于远程分支但不在本地分支上的特定提交,从而详细了解两者之间的差异。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL git(("Git")) -.-> git/BasicOperationsGroup(["Basic Operations"]) git(("Git")) -.-> git/BranchManagementGroup(["Branch Management"]) git(("Git")) -.-> git/CollaborationandSharingGroup(["Collaboration and Sharing"]) git/BasicOperationsGroup -.-> git/status("Check Status") git/BranchManagementGroup -.-> git/log("Show Commits") git/CollaborationandSharingGroup -.-> git/fetch("Download Updates") git/CollaborationandSharingGroup -.-> git/pull("Update & Merge") git/CollaborationandSharingGroup -.-> git/remote("Manage Remotes") subgraph Lab Skills git/status -.-> lab-560042{{"如何检查 Git 分支是否落后于远程分支"}} git/log -.-> lab-560042{{"如何检查 Git 分支是否落后于远程分支"}} git/fetch -.-> lab-560042{{"如何检查 Git 分支是否落后于远程分支"}} git/pull -.-> lab-560042{{"如何检查 Git 分支是否落后于远程分支"}} git/remote -.-> lab-560042{{"如何检查 Git 分支是否落后于远程分支"}} end

使用 git fetch 获取远程仓库内容

在这一步中,你将学习如何从远程 Git 仓库获取更改。假设你正在与他人协作,他们对项目进行了一些更改。git fetch 这个命令可以让你将这些更改下载到本地机器,但不会将它们合并到你当前的工作中。

首先,我们来模拟一个远程仓库。为了便于演示,我们将在本地创建一个简单的仓库。

cd ~/project
mkdir remote-repo
cd remote-repo
git init --bare

这将创建一个“裸”仓库,通常用作中央远程仓库。现在,让我们回到 my-time-machine 仓库,并将这个仓库添加为远程仓库。

cd ~/project/my-time-machine
git remote add origin ../remote-repo

我们已经添加了一个名为 origin 的远程仓库,它指向我们模拟的远程仓库。现在,让我们在远程仓库中进行一些更改,然后获取这些更改。

cd ~/project/remote-repo
echo "This is a remote change." > remote_file.txt
git add remote_file.txt
git commit -m "Add remote file"

现在,回到 my-time-machine 仓库,从远程仓库获取更改。

cd ~/project/my-time-machine
git fetch origin

你应该会看到输出信息,表明 Git 已经从远程仓库下载了更改。类似如下内容:

remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 2 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (2/2), 258 bytes | 258.00 KiB | elapsed 0.00s.
From ../remote-repo
 * [new branch]      master     -> origin/master

git fetch 命令会将远程仓库中的提交、文件和引用下载到你的本地仓库。不过,它不会自动将这些更改合并到你当前的工作分支中。这让你可以在集成这些更改之前先检查它们。

可以把 git fetch 想象成从新闻源获取最新的更新。你看到了标题和摘要,但还没有阅读完整的文章。你可以稍后再决定要阅读(合并)哪些文章(更改)。

使用 git status 检查落后状态

在上一步中,我们从远程仓库获取了更改。现在,让我们使用 git status 来查看本地仓库与远程仓库的差异。

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

cd ~/project/my-time-machine

现在,运行 git status 命令:

git status

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

On branch master
Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded.
  (use "git pull" to update your local branch)

nothing to commit, working tree clean

这个输出告诉了我们一些重要信息:

  • "On branch master":我们当前位于 master 分支。
  • "Your branch is behind 'origin/master' by 1 commit":这是关键信息!它表明我们的本地 master 分支比 origin 远程仓库的 master 分支落后一个提交。这意味着远程仓库上有一个提交是我们本地还没有的。
  • "(use "git pull" to update your local branch)":Git 甚至还给了我们一个提示,告诉我们如何更新本地分支。

git status 命令是你了解仓库状态的窗口。它会告诉你当前所在的分支、是否有未提交的更改,以及当前分支与其上游分支(在本例中为 origin/master)的差异。

理解 git status 的输出对于有效地使用 Git 至关重要。它能帮助你判断是否需要从远程仓库拉取更改、是否有更改需要提交,或者你的工作目录是否干净。

使用 git log HEAD..@{u} 查看落后的提交

在上一步中,git status 告诉我们本地分支落后于远程分支。但我们如何查看具体落后了哪些提交呢?

我们可以使用带有特殊语法的 git log 命令,只显示远程分支上有但本地分支上没有的提交。语法 HEAD..@{u} 用于比较当前分支(HEAD)与其上游分支(@{u},在我们的例子中是 origin/master)。

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

cd ~/project/my-time-machine

现在,运行以下命令:

git log HEAD..@{u}

你应该会看到在第一步中我们在远程仓库所做提交的日志条目:

commit <commit-hash> (origin/master)
Author: Your Name <[email protected]>
Date:   <Date and Time>

    Add remote file

这个命令非常有用,它能让你确切地看到从远程仓库拉取更改时会获得哪些内容。它会显示远程跟踪分支(origin/master)上存在但本地分支(master)上还没有的提交历史。

了解如何查看自己落后的提交,对于及时了解协作者的工作以及规划合并操作非常重要。

q 键退出日志查看界面。

总结

在本次实验中,我们学习了如何检查本地 Git 分支是否落后于其对应的远程分支。我们首先模拟了一个远程仓库,并使用 git remote add 将其添加到本地项目中。然后,我们练习了使用 git fetch 从远程仓库下载更改但不进行合并,展示了该命令如何用最新的远程信息更新本地仓库。

在执行 fetch 操作之后,我们通常会使用 git status 来查看当前分支是否落后于远程跟踪分支,并使用 git log HEAD..@{u} 查看远程仓库中存在但本地分支中尚未包含的具体提交。这些步骤共同为我们清晰呈现了本地工作与远程仓库之间的差异。