在 Mac 上,打开终端,进入代码仓库,然后运行 git status -sb。如果当前分支显示相对于其上游分支 ahead 1(或另一个正数),则说明它包含 Git 进行比对的远程跟踪分支中未体现的本地提交。先执行 fetch 刷新比对状态,然后列出具体的提交。此操作检查的是已提交的历史记录;尚未提交的编辑则属于另一种本地更改。

对照远程跟踪分支检查当前分支

在终端中,切换到项目文件夹。你可以输入 cd ,将文件夹从访达(Finder)拖入终端窗口,然后按 Return 键。运行:

git status -sb

如果输出类似于 ## main...origin/main [ahead 2],则意味着根据 Git 最近记录的远程状态,本地 main 分支比其配置的上游分支 origin/main 领先两个提交。[behind 1] 表示所跟踪的远程分支有一个在本地不存在的提交。如果两个计数同时出现,则说明分支已分叉(diverged)。Git 文档指出,当设置了上游分支且可用于比对时,status 可以显示领先(ahead)和落后(behind)的计数。Git status 文档

如需获取完整状态,请使用 git status。它还会报告工作区和暂存区的更改。这些已修改或未跟踪的文件并不是未推送提交的证据:它们尚未成为提交。干净的工作区仍可能包含未推送的提交,而有未暂存修改的工作区也可能完全没有未推送的提交。

刷新比对状态,然后检查提交

origin/main 这一名称是本地的远程跟踪引用;它并不是服务器状态的实时视图。运行 fetch 以从配置的远程仓库更新引用,然后再次检查状态:

git fetch
git status -sb

git fetch 会更新远程跟踪信息,但不会将获取到的这些更改合并到你当前的分支中。它也不会推送本地提交。如果无法连接到远程仓库或身份验证不可用,fetch 可能会失败;在这种情况下,旧的比对无法反映服务器当前的实际状态。Git fetch 文档

如果状态显示分支处于领先(ahead)状态且具有上游分支,可以显示从当前分支可达但从该上游分支不可达的提交:

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

输出的每一行代表一个提交;第一行是该范围内最新的提交。空结果意味着 Git 在该范围内没有找到任何提交。@{u} 简写表示当前分支配置的上游分支,双点范围则会选出可从 HEAD 访问但不可从上游分支访问的提交。Git revisions 文档

例如,如果 status 显示 [ahead 2],并且 log 列出了两个提交主题,那么这些就是本地领先于所跟踪分支的提交。在决定是否打算推送它们之前,这是一个有用的确认步骤。该命令本身不会发送任何内容。

如果 Git 无法比对分支

如果 git status -sb 没有显示领先/落后计数,则该分支可能尚未配置上游分支。运行:

git branch -vv

当前分支会标有 *;方括号中的文本(若存在)标识了其上游分支及分叉计数。如果没有显示上游分支,则 Git 没有用于此比对的常规跟踪引用。git remote -v 可以显示已配置的远程仓库名称和 URL,但它无法确定哪个远程分支才是预期的目标分支。Git 文档将上游分支说明为供 status 等命令使用的可选分支设置。Git pull 文档

避免盲目猜测 origin/main:你的分支可能跟踪的是一个名称不同的分支或不同的远程仓库。如果你知道预期的远程分支,请在 fetch 后进行明确比对,将 origin/main 替换为其真实名称:

git log --oneline origin/main..HEAD

这将列出当前 HEAD 中存在但该引用中不存在的提交。如果目标不确定,在将结果视为推送预览之前,请先检查分支和远程配置。Git 允许配置的推送目标与用于比对的上游分支不同。Git revisions 文档

此检查能确认什么,不能确认什么

该比对的有效性仅取决于上一次成功的 fetch。在你执行 fetch 之后,其他人可能会推送新的提交,或者服务器可能会在你推送之前发生改变。一次成功的 fetch 会为 Git 提供一个更新的引用;但它不能保证后续的推送一定成功。同样,origin/main 中不存在的提交并不一定在每个远程仓库或分支中都不存在。

当你确认了预期的目标分支并希望发送这些提交时,请使用适合你仓库分支和远程配置的 push 命令。如果 Git 提示未配置上游分支,则可能需要显式指定远程仓库和分支;在推送前请仔细核对目标。上述步骤能够理清本地历史与跟踪历史的差异,从而帮助你在不将未提交的文件修改与提交混淆的前提下做出决策。

参考来源