为什么git有时显示消息,有时不显示消息;你的分行在';无论什么/上游';由n提交?“;

为什么git有时显示消息,有时不显示消息;你的分行在';无论什么/上游';由n提交?“;,git,Git,对于我的许多repo,所有这些repo都正确设置了上游,并通过git remote--v命令报告,但是,当我在本地提交并且在推送到服务器之前,仅对于一些repo,它告诉我有用的消息: $ git status Your branch is ahead of 'whatever/upstream' by n commits. 而对于其他人,它总是只说: $ git status nothing to commit, working tree clean. 很明显,我的本地回购协议比远程

对于我的许多repo,所有这些repo都正确设置了上游,并通过
git remote--v
命令报告,但是,当我在本地提交并且在推送到服务器之前,仅对于一些repo,它告诉我有用的消息:

$ git status
  Your branch is ahead of 'whatever/upstream' by n commits.
而对于其他人,它总是只说:

$ git status
  nothing to commit, working tree clean.
很明显,我的本地回购协议比远程回购协议向前提交了几次


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

git status命令做了很多事情,可能最重要的是它运行两个
git diff
s,以了解您的
提交、索引和工作树是如何相互关联的,但它做的前几件事是:

  • 如果您在分支上,请打印当前分支的名称
  • 打印前进和/或落后的计数,如果您在分支上且该分支具有上游集计数为非零
您可以使用
--no ahead behind
禁用前进/后退计数,或使用
--ahead behind
启用它们。(默认设置已启用。)

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

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

至于评论中提到的分离头,分离头仅仅意味着你不在分支上。当您通过
git checkout--detach
或对非分支名称的对象使用
git checkout
请求时,此模式是正常的。正如你提到的,当你处于一个尚未完成的重置操作的中间时,这也是正常的。在这些情况下,modern
git status
会生成一条信息性消息,告诉您处于这种超脱的头部模式,以及(在某种程度上)为什么


由于分离的头没有上游,因此只有分支名称具有上游设置,因此此模式永远不会有任何前进/后退计数。

如果您在分支上提交了提交,而没有推送,则git状态将显示该分支的前进/后退计数。如果您切换到另一个尚未执行此操作的分支,它将不会显示此操作。你能提供更多细节,说明为什么你希望它也能显示出其他分支机构的情况吗?@LasseVågsætherKarlsen我正在询问不同回购协议的分支机构,在这两种情况下,分支机构在本地回购协议中的“未推送”承诺明显多于上游回购协议。可能与回购协议的设置方式有关?当前分支没有上游或处于分离头状态。@ElpieKay分支有一个远程上游集,因为当我运行
git remote--v
命令时,它会告诉我远程上游名称和url。我忘了超脱的头部状态意味着什么。我记得它模糊地与几个用例(例如,当你把头移到一个早期的提交,或者是在一个ReBASE中间,或者一个樱桃拾取,等等),我会再次阅读它。同时,你能用几个简单易懂的句子解释一下吗?不完全是重复的,但你是对的。我的一个回购协议中的分支没有上游集,即使设置了远程。我忘记了
——设置为上游的
,直到你的回答让我想起它。非常感谢。:-)