如何检查 Git 分支是否与远程分支产生分歧

GitGitBeginner
立即练习

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

简介

在这个实验中,你将学习如何检查本地 Git 分支是否与远程分支出现了分歧。这是协作开发以及及时了解项目变更的一项基本技能。

我们将首先从模拟的远程仓库获取更新,并使用 git status 来确定你的本地分支是否落后。随后,你将探索如何使用 git log 来比较本地分支和远程分支之间的提交记录,最后,使用 git diff @{u} HEAD 来验证是否存在分歧。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL git(("Git")) -.-> git/CollaborationandSharingGroup(["Collaboration and Sharing"]) git(("Git")) -.-> git/BasicOperationsGroup(["Basic Operations"]) git(("Git")) -.-> git/BranchManagementGroup(["Branch Management"]) git/BasicOperationsGroup -.-> git/status("Check Status") git/BasicOperationsGroup -.-> git/diff("Compare Changes") git/BranchManagementGroup -.-> git/log("Show Commits") git/CollaborationandSharingGroup -.-> git/fetch("Download Updates") subgraph Lab Skills git/status -.-> lab-560038{{"如何检查 Git 分支是否与远程分支产生分歧"}} git/diff -.-> lab-560038{{"如何检查 Git 分支是否与远程分支产生分歧"}} git/log -.-> lab-560038{{"如何检查 Git 分支是否与远程分支产生分歧"}} git/fetch -.-> lab-560038{{"如何检查 Git 分支是否与远程分支产生分歧"}} end

获取并检查 git 状态以查看是否有分歧

在这一步中,你将学习如何检查远程仓库中是否有本地没有的更改。当你与他人协作或处理在其他地方更新的项目时,这一点至关重要。

首先,让我们模拟一个有一些更改的远程仓库。在实际场景中,这可能是一个托管在 GitHub 或 GitLab 等平台上的仓库。在这个实验中,我们将使用一个本地目录来充当我们的“远程仓库”。

如果你还没在项目目录中,请导航回到该目录:

cd ~/project/my-time-machine

现在,让我们从模拟的远程仓库获取最新更改。我们将使用 git fetch 命令。此命令会将提交、文件和引用从远程仓库下载到你的本地仓库,但 不会 将它们合并到你当前的分支中。

git fetch origin

如果没有新的更改,你可能看不到太多输出。不过,git fetch 会更新你本地仓库中关于远程分支的信息。

接下来,我们将使用 git status 来查看本地分支是否落后于远程分支。git status 命令是了解仓库当前状态的窗口。它会告诉你已暂存、未暂存和未跟踪的文件信息,还会提供当前分支与其上游分支之间的关系信息。

运行 git status 命令:

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

此消息表明你的本地 master 分支比 origin/master 分支(主分支的远程版本)落后一个提交。它还建议使用 git pull 来更新你的本地分支,我们将在后续实验中介绍该操作。

理解获取操作后 git status 的输出很重要,因为在你决定将远程仓库的更改集成到本地工作之前,它能让你知道是否有新的更改。这有助于避免潜在的冲突,并让你了解项目的进展情况。

使用 git log 比较提交记录

在上一步中,我们使用 git status 来查看本地分支是否落后于远程分支。现在,让我们使用 git log 来查看远程分支上有但本地分支上没有的实际提交记录。

git log 命令功能非常强大,它允许你以多种不同的方式查看提交历史。要比较本地分支 (HEAD) 和远程跟踪分支 (origin/master),可以使用以下语法:

git log HEAD..origin/master

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

cd ~/project/my-time-machine

现在,运行 git log 命令来比较分支:

git log HEAD..origin/master

如果 origin/master 上有提交记录是本地 HEAD(当前指向本地 master 分支)所没有的,此命令将列出这些提交记录。输出将显示每个存在于 origin/master 但不在当前分支中的提交的详细信息,包括提交哈希、作者、日期和提交消息。

例如,如果远程仓库有一个新的提交,输出可能如下所示:

commit abcdef1234567890abcdef1234567890abcdef (origin/master)
Author: Another User <[email protected]>
Date:   Tue Aug 8 10:00:00 2023 +0000

    Add a new feature

此输出清晰地显示了远程仓库有但本地没有的提交。HEAD..origin/master 语法告诉 Git 显示那些可以从 origin/master 访问但不能从 HEAD 访问的提交。

以这种方式使用 git log 是理解分支之间差异的强大工具,它能让你确切地了解如果更新本地分支会获得哪些更改。与 git status 相比,它能提供更多关于导致分支分歧的具体提交的详细信息。

如果日志视图在分页器中打开,请记得按 q 退出。

使用 git diff @{u} HEAD 进行验证

在前面的步骤中,我们使用 git status 查看本地分支是否落后于远程分支,使用 git log 查看不同的提交记录。现在,让我们使用 git diff 来查看远程分支上的那些提交相对于本地分支所引入的实际代码更改。

git diff 命令用于显示 Git 历史中两个时间点之间的差异。我们可以用它来比较当前本地分支 (HEAD) 与其上游分支。上游分支是本地分支所跟踪的远程仓库中的分支。在我们的例子中,master 分支的上游分支是 origin/master。Git 为上游分支提供了一个便捷的简写:@{u}@{upstream}

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

cd ~/project/my-time-machine

现在,运行 git diff 命令来查看本地分支与其上游分支之间的差异:

git diff @{u} HEAD

此命令将逐行显示当前提交 (HEAD) 中的文件与上游分支最新提交 (@{u}) 中的文件之间的差异。

如果远程仓库有你尚未拉取的更改,输出将显示这些差异。例如,如果远程仓库在 message.txt 中添加了一行,输出可能如下所示:

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 from the remote.

+ 号表示存在于上游分支 (@{u}) 但不在本地分支 (HEAD) 中的行。

使用 git diff @{u} HEAD 是在将远程仓库的更改合并到本地分支之前预览这些更改的强大方法。它能让你确切了解所做的修改,这对于代码审查或简单地了解项目的发展情况非常有帮助。

如果差异视图在分页器中打开,请按 q 退出。

总结

在本次实验中,我们学习了如何检查本地 Git 分支是否与对应的远程分支产生了分歧。首先,我们模拟了一个远程仓库,并使用 git fetch 在不合并的情况下获取最新更改。随后,我们使用 git status 快速识别本地分支是否落后于远程分支,当出现类似“Your branch is behind 'origin/master' by X commit”的消息时,就表明本地分支落后了。

在使用 git status 进行初步检查之后,我们探索了更详细的分支比较方法。我们学习了如何使用带有各种选项的 git log 来可视化提交历史,并识别本地分支和远程分支之间的差异。最后,我们了解了 git diff @{u} HEAD 的作用,它可以精确比较上游分支和当前 HEAD 之间的更改,让我们清晰地看到分支之间的分歧。