对于我的许多转发,所有这些转发的上游都已正确设置,并由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没有上游——只有分支名称有上游设置——因此该模式永远不会有任何超前/滞后计数。