如何检查 Git 分支是否领先于远程分支

GitGitBeginner
立即练习

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

简介

在本次实验中,你将学习如何检查本地 Git 分支是否领先于对应的远程分支。在推送更改之前,了解仓库的状态是一项至关重要的技能。你将探索两种主要方法:使用 git status 查看“领先”状态,以及使用 git log@{u}..HEAD 语法查看领先的具体提交。

通过实践练习,你将模拟进行本地提交,然后使用这些命令观察 Git 如何指示本地分支与远程分支出现了分歧。最后,你将在同步的分支上测试这些方法,以查看没有提交领先时的预期输出。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL git(("Git")) -.-> git/DataManagementGroup(["Data Management"]) 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/DataManagementGroup -.-> git/reset("Undo Changes") git/BranchManagementGroup -.-> git/log("Show Commits") subgraph Lab Skills git/add -.-> lab-560041{{"如何检查 Git 分支是否领先于远程分支"}} git/status -.-> lab-560041{{"如何检查 Git 分支是否领先于远程分支"}} git/commit -.-> lab-560041{{"如何检查 Git 分支是否领先于远程分支"}} git/reset -.-> lab-560041{{"如何检查 Git 分支是否领先于远程分支"}} git/log -.-> lab-560041{{"如何检查 Git 分支是否领先于远程分支"}} end

通过 git status 检查领先状态

在这一步中,你将学习如何检查 Git 仓库的状态,尤其关注 Git 如何提示本地分支是否“领先”于远程分支。当你在本地进行了提交,但尚未将这些更改推送到远程仓库时,就会出现这种常见情况。

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

cd ~/project/my-time-machine

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

echo "Another message for the future" >> message.txt

此命令将文本“Another message for the future”追加到现有的 message.txt 文件中。

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

git add message.txt

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

git commit -m "Add another message"

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

[master 1a2b3c4] Add another message
 1 file changed, 1 insertion(+)

很棒!你已经在本地的 master 分支上创建了一个新的提交。不过,这个提交仅存在于本地。如果你有一个远程仓库(例如在 GitHub 或 GitLab 上),这个提交还不会出现在那里。

让我们再次使用 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.。这是 Git 在告诉你,本地的 master 分支有一个提交未出现在 origin/master 分支上(origin/master 代表名为 origin 的远程仓库上的 master 分支)。

这种“领先”状态是一个关键指标,表明你有本地更改需要推送到远程仓库,以便与他人共享或进行远程备份。理解这种状态对于与他人协作以及保持本地和远程仓库的同步至关重要。

使用 git log @{u}..HEAD 查看领先的提交

在上一步中,你已经了解到 git status 可以提示本地分支“领先”于远程跟踪分支。但如何查看哪些提交是领先的呢?Git 提供了一种强大的方法,即使用 git log 来比较分支。

@{u}..HEAD 这种语法是 Git 中的一种简写形式。@{u} 指的是上游分支(即当前分支配置为跟踪的远程跟踪分支,例如 origin/master),而 HEAD 指的是当前本地分支的最新提交。因此,@{u}..HEAD 的意思是“显示当前分支(HEAD)上存在,但上游分支(@{u})上不存在的提交”。

让我们在终端中尝试执行这个命令。确保你仍然位于 ~/project/my-time-machine 目录中:

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

你应该会看到上一步中刚刚创建的提交的日志条目:

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

    Add another message

(注意:你输出中的提交哈希值和日期会有所不同,但提交消息应该是相同的。)

这个命令对于确切了解你即将推送到远程仓库的更改非常有用。它可以帮助你审查自己的工作,并确保只推送预期的提交。

@{u}..HEAD 语法是 git log 的范围表示法的一个具体示例。你可以使用类似的语法来比较任意两个提交或分支。例如,branch1..branch2 会显示 branch2 上存在但 branch1 上不存在的提交。

了解如何使用带有范围表示法的 git log,可以让你更精细地查看项目历史记录,并比较仓库的不同状态。

q 键退出日志视图并返回命令行。

测试同步分支

在前面的步骤中,你已经了解了当本地分支领先于远程跟踪分支时会发生什么。现在,让我们看看当本地分支与远程跟踪分支同步时,git statusgit log @{u}..HEAD 会显示什么信息。

由于在这个实验环境中没有真实的远程仓库,你可以通过移除刚刚创建的提交来模拟同步状态。在实际场景中,同步意味着你已经将本地提交推送到了远程仓库。

你可以使用 git reset 将本地分支指针移回到上一个提交。在实际项目中使用 git reset 时要小心,因为它可能会丢弃更改! 在这个实验中,这样做是安全的,因为只是在模拟一种状态。

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

cd ~/project/my-time-machine

现在,将分支重置到倒数第二个提交。可以使用 HEAD~1 来引用当前 HEAD 之前的提交。

git reset --hard HEAD~1

你应该会看到类似以下的输出,表明 HEAD 已回退,工作目录也已更新:

HEAD is now at a1b2c3d Send a message to the future

(注意:提交哈希值将与你的第一次提交的哈希值匹配。)

现在,已经将本地分支重置到第一次提交的状态,再次检查状态:

git status

这次,输出应该表明你的分支与远程跟踪分支是最新的:

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

nothing to commit, working tree clean

消息 Your branch is up to date with 'origin/master'. 表明本地的 master 分支与远程跟踪分支是同步的。

最后,再次使用 git log @{u}..HEAD 查看是否有领先的提交:

git log @{u}..HEAD

这个命令应该没有输出,因为本地分支(HEAD)上没有不在上游分支(@{u})上的提交。

这证实了本地分支现在与远程跟踪分支是同步的。理解 git status 的输出并使用 git log @{u}..HEAD 是管理 Git 工作流程和有效协作的重要技能。

总结

在这个实验中,你学习了如何检查本地 Git 分支是否领先于对应的远程分支。首先,你进行了一次本地提交,然后使用 git status 查看“领先”状态消息,该消息表明本地分支包含尚未推送到远程的提交。

你还学习了使用 git log @{u}..HEAD 来具体列出领先于远程跟踪分支的提交,从而更详细地了解差异。最后,你测试了同步分支的情况,以确认当本地没有领先于远程的提交时,git status 会报告分支是最新的。