我认为您在这里的根本问题可能在于您查看“提交的分支”(组成一个短语)的方式。或者,可能只是您限制了“上游”的概念。
让我用这个来说明:
...--o--o--o--o <-- master, origin/master
这是分支master 上至少四个提交的绘图,master 与origin/master 同步。
...--o--o--o--o <-- origin/master
\
o <-- master
这是在master 上添加一个不在origin/master 上的提交后的同一个存储库,因此分支master 是“领先1”,正如git status 所说的那样。
现在让我们将master 放回原来的位置,但保留新的提交,将它添加到我们使用git checkout -b newbr 制作的newbr,而不是仅仅添加到master:
...--o--o--o--o <-- master, origin/master
\
o <-- newbr
您希望 Git 能够告诉您newbr 比某事“领先1”。问题在于定义“某物”。
这是基本技巧:所有在master 和origin/master 上的提交,也在newbr 上。一次分支,包括多个本地和远程跟踪分支。
git status 计算“前面”和“后面”数字的方式是使用git rev-list --count,并使用“上游”设置排除当前分支上的提交和上游。所以在我们的第二个例子中,当master 是“领先1”时,master 和origin/master 都至少有最初的四个提交,但master 比origin/master 多一个。
(git status 正在做的是git rev-list --count origin/master..master,即,在选择 master 上的所有提交减去 origin/master 上的所有提交后剩余的所有内容。当然,它使用你的而不是文字 master当前分支,而不是文字 origin/master,它使用您当前分支的上游。)
这意味着,为了让git status 报告这样的事情,我们必须选择——至少是暂时的——某个分支,甚至可能是一个本地分支,而不是一个远程跟踪分支, 设置为newbr 的“上游”。
在这个特定的绘图中,master 和 origin/master 都是 git branch --set-upstream-to 中上游的合适值。您的存储库会有所不同,但您希望 Git 开始排除的提交会有 一些 名称。 (即使没有,您也可以简单地为排除点创建一个新分支。但几乎总是有一个。)
使用git log --graph --oneline --decorate --all 让Git 绘制这些图的文本版本(垂直,而不是水平),标签显示哪些分支和标签名称指向哪些提交。这通常会使哪些分支名称适合上游名称在视觉上很明显。
请记住,本地分支作为上游可以正常工作,只要您记得在拥有适当的远程跟踪分支后重新设置上游。
(顺便说一句,如果您不喜欢使用本地分支作为新分支的上游,您可以在远程创建分支,指向您的分支“开始于”的提交。例如,在示例中如上图所示,您可能希望origin/newbr 指向与master 和origin/master 相同的提交。因此您可以使用:
git push origin master:newbr
在远程origin 上创建newbr,指向本地master 指向的同一个提交。完成此操作后,origin/newbr 现在就存在了,所以现在您可以将其设置为 newbr 的上游。
如果有更具体的提交,只能通过其哈希 ID 识别,您甚至可以使用它:
git push origin a123456:refs/heads/newbr
当通过原始 SHA-1 哈希识别提交时,您应该像这样拼出完整的参考名称,因为 Git 无法再使用您的本地名称来确定您想要一个分支还是一个标签。)