显示本地(非跟踪)分支上的未提交提交数

U r*_*u s 3 git version-control github

我已经在一个本地分支上工作了太长时间而没有推动上游并且丢失了我在本地提交了多少次提交的数量.

我现在准备推送我的提交,但我需要确切的提交数量才能用它们压缩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.

为了解决这个问题,我当然可以将我的分支推到上游,但这会破坏我压缩我的提交的初衷.

所以我感到困惑.有人能建议吗?

tor*_*rek 5

我认为你的根本问题可能在于你查看"提交的分支"(构成一个短语)的方式.或者,可能只是因为你限制了你的"上游"概念.

让我举一例说明:

...--o--o--o--o   <-- master, origin/master
Run Code Online (Sandbox Code Playgroud)

这是分支上至少四次提交的图master,与之master同步origin/master.

...--o--o--o--o   <-- origin/master
               \
                o   <-- master
Run Code Online (Sandbox Code Playgroud)

在添加一个master未启用的提交后,这是相同的存储库origin/master,因此该分支master是"提前1",就像git status它所说的那样.

现在让我们把master它放回原处,但保留新的提交,将其添加到newbr我们制作的地方git checkout -b newbr而不是仅仅添加它master:

...--o--o--o--o   <-- master, origin/master
               \
                o   <-- newbr
Run Code Online (Sandbox Code Playgroud)

你希望Git能够告诉你那newbr是"先行"的东西.问题在于定义"某事".

这里的基本诀窍:所有那些在提交时master,也对origin/master,也对newbr. 提交可以同时在许多分支上,包括多个本地和远程跟踪分支.

该方法git status计算要使用的"前方"和"后方"数字git rev-list --count,并使用"上游"设置来排除当前分支上游的提交.因此,在我们的第二个例子,当master是"后1",两者masterorigin/master至少有原四点提交,但master有不止一个origin/master.

(git status正在做的是git rev-list --count origin/master..master,计算在选择所有提交后master减去所有提交的剩余内容origin/master.当然master,它使用当前分支而不是文字origin/master,而不是文字,它使用当前分支的上游.)

这意味着,为了git status报告这样的事情,我们必须选择 - 至少暂时 - 某个分支,甚至可能是本地分支而不是远程跟踪分支,将其设置为"上游" newbr.

在这个特定的图中,都masterorigin/master用于在上游合适的值git branch --set-upstream-to.您的存储库会有所不同,但是您希望Git开始排除的提交会有一些名称.(即使没有,你可以简单地为排除点创建一个新的分支.但是那里几乎总有一个分支.)

使用git log --graph --oneline --decorate --all与标签显示其分支和标签名称指向该承诺得到Git的画这些图形的文本版本(垂直,而不是水平).这通常使视觉上明显哪些分支名称适合上游名称.

请记住,本地分支作为上游工作正常,只要您记得在拥有适当的远程跟踪分支后重新设置上游.

(顺便说一句,如果您不喜欢使用本地分支作为新分支的上游,则可以在远程创建分支,指向您的分支"从"开始的提交.例如,在上面的示例图中,你可能要origin/newbr指向同一个commit为masterorigin/master那么你可以使用:

git push origin master:newbr
Run Code Online (Sandbox Code Playgroud)

newbr在远程创建origin,指向同一个提交您的本master地点.一旦你完成了,origin/newbr现在就存在,所以现在你可以将它设置为上游newbr.

如果有一个更具体的提交,只能通过其哈希ID识别,您甚至可以使用它:

git push origin a123456:refs/heads/newbr
Run Code Online (Sandbox Code Playgroud)

当通过其原始SHA-1哈希识别提交时,您应该拼出这样的完整引用名称,因为Git不能再使用您的本地名称来确定您是否打算使用分支或标记.)