为什么 git 有时会显示消息,有时不显示消息"Your branch is ahead of 'whatever/upstream' by n commits?"



对于我的许多转发,所有这些转发的上游都已正确设置,并由git remote --v命令报告,但当我在本地提交时,在推送到服务器之前,只有对于某些转发,它"告诉"我有帮助的消息:

$ git status
Your branch is ahead of 'whatever/upstream' by n commits.

而对于其他人,它总是只说:

$ git status
nothing to commit, working tree clean.

很明显,我的本地回购比远程回购向前提交了几次。

我想这与我创建本地回购的方式有关,无论是通过克隆现有的远程回购,还是通过git init,然后设置上游并推送?但我不能确定。

git status命令做了很多事情——可能最重要的是它运行两个git diff,以了解HEAD提交、索引和工作树之间的关系——但它做的前几件事是:

  • 如果您在分支上,请打印当前分支的名称
  • 打印前和/或后的计数,如果您在分支上并且该分支具有上游,则计数为非零

您可以使用--no-ahead-behind禁用超前/滞后计数,也可以使用--ahead-behind启用它们。(默认已启用。)

为了计算计数,Git使用git rev-list --count。有关如何工作的详细信息,请参阅本地分支的git分支前面和后面?请注意,计数是基于分支的上游设置的,因此,如果您在分支B上,并且其上游为origin/B,则这是对可从分支B访问但不能从远程跟踪名称origin/B访问的提交进行计数的结果,反之亦然。如果origin/B不是origin上的B的最新版本,则此计数没有您想要的那么有用;运行git fetch origin以根据需要对其进行更新。

每个分支都有自己独立的上游设置。任何一个分支名称都可以有一个上游,也可以没有上游。上游通常是一个远程跟踪名称(origin/whatever),但它可以是任何名称,包括其他普通的本地分支名称。git branch --set-upstream-to命令或git branch --unset-upstream是操作任何现有分支名称的上游设置的主要现代方法。(实际设置很复杂,可以通过git config或编辑.git/config进行修改。)

至于注释中提到的分离HEAD,分离HEAD只是表示您不在分支上。当您通过git checkout --detach或在非分支名称上使用git checkout请求时,此模式是正常的。正如您提到的,当您正在进行尚未完成的重新基本操作时,这也是正常的。在这些情况下,现代git status会生成一条信息性消息,告诉您处于这种分离的HEAD模式,以及(在某种程度上)原因。

由于分离的HEAD没有上游——只有分支名称有上游设置——因此该模式永远不会有任何超前/滞后计数。

最新更新