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