我在本地分支上工作太久了,没有 push 上游,也没有忘记我在本地有多少提交。
我现在已准备好推送我的提交,但我需要确切的提交数量才能使用 git rebase -i HEAD~4
压缩它们。 (4 只是一个例子)。
我如何找到那个号码?
我试过 git rev-list --count my-local-branch
,但它显示了一个非常高的数字,这不是我想要的(我大约有 6 次提交)。
还有git log --graph --all --decorate --oneline
没有给我想要的。
我认为问题在于my-local-branch
不是跟踪的远程分支。
所以我尝试使用 git branch -u upstream/my-local-branch
手动设置它,但返回 error: the requested upstream branch 'upstream/my-local-branch' does not exist
.
为了解决这个问题,我当然可以将我的分支推向上游,但这会破坏我压缩提交的初衷。
所以我觉得卡住了。任何人都可以建议?
最佳答案
我认为您在这里的根本问题可能在于您查看“提交的分支”(构成一个短语)的方式。或者,可能只是您限制了“上游”的概念。
让我用这个来说明:
...--o--o--o--o <-- master, origin/master
这是分支
master
上至少四个提交的图,其中 master
与 origin/master
同步。...--o--o--o--o <-- origin/master
\
o <-- master
在
master
上添加一个不在 origin/master
上的提交后,这是同一个存储库,因此分支 master
是“ahead 1”,正如 git status
所说的那样。现在让我们将
master
放回原来的位置,但保留新的提交,将它添加到我们用 newbr
制作的 git checkout -b newbr
上,而不是仅仅添加到 master
上:...--o--o--o--o <-- master, origin/master
\
o <-- newbr
您希望 Git 能够告诉您
newbr
比某事“领先 1”。问题在于定义“某物”。这是基本技巧: 所有在
master
和 origin/master
上的提交,也在 newbr
上。 提交可以同时在多个分支上进行,包括多个本地和远程跟踪分支。git status
计算“ahead”和“behind”数字的方法是使用 git rev-list --count
,并使用“upstream”设置来排除当前分支和上游的提交。所以在我们的第二个例子中,当 master
为“ahead 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
在远程
newbr
上创建 origin
,指向本地 master
指向的相同提交。完成后, origin/newbr
现在存在,因此现在您可以将其设置为 newbr
的上游。如果有更具体的提交,只能通过其哈希 ID 识别,您甚至可以使用它:
git push origin a123456:refs/heads/newbr
当通过原始 SHA-1 哈希识别提交时,您应该像这样拼出完整的引用名称,因为 Git 不能再使用您的本地名称来确定您想要分支还是标签。)
关于git - 显示本地(非跟踪)分支上未推送提交的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37661944/