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

时间:2016-06-06 16:00:36

标签: git github version-control

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

我现在准备推送我的提交,但是我需要完全我的提交数量,以便用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

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

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

2 个答案:

答案 0 :(得分:5)

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

让我用这个来说明:

...--o--o--o--o   <-- master, origin/master

这是分支master上至少四次提交的图,其中masterorigin/master同步。

...--o--o--o--o   <-- origin/master
               \
                o   <-- master

master上添加一个不在origin/master上的提交后,这是相同的存储库,因此分支master为&#34;提前1&#34;,为{{ 1}}会把它。

现在让我们将git status放回原处,但保留新的提交,将其添加到我master newbr上,而不是仅添加git checkout -b newbr master

...--o--o--o--o   <-- master, origin/master
               \
                o   <-- newbr

你希望Git告诉你newbr是&#34; 1提前&#34; 某事。问题在于定义&#34;某些东西&#34;。

以下是基本技巧: master以及origin/master上的所有提交也在newbr上。 提交可以同时在许多分支上进行,包括多个本地和远程跟踪分支。

git status计算&#34;提前&#34;的方式&#34;背后&#34;数字是使用git rev-list --count,并使用&#34;上游&#34;设置为当前分支上游的排除提交。因此,在我们的第二个插图中,当master是&#34;提前1&#34;时,masterorigin/master至少有原始的四次提交,但是master超过origin/master

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

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

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

使用git log --graph --oneline --decorate --all让Git绘制这些图形的文本版本(垂直而不是水平),标签显示哪些分支和标记名称指向哪些提交。这通常可以直观地显示哪些分支名称适合上游名称。

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

(顺便说一句,如果你不喜欢使用本地分支作为新分支的上游分支,你可以在你的分支机构上创建分支,指向你的分支机构提交&#34;从&#34;例如,在上面的示例图中,您可能希望origin/newbr指向与masterorigin/master相同的提交。因此您可以使用:

git push origin master:newbr

在远程newbr上创建origin,指向您的本地master指向的相同提交。完成后,origin/newbr现已存在,因此现在您可以将其设置为newbr的上游。

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

git push origin a123456:refs/heads/newbr

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

答案 1 :(得分:2)

git status将告诉您跟踪的远程分支背后有多少提交。

使用git branch -u upstream/my-local-branch在远程设置跟踪是正确的,但是如果远程分支名称不同,则需要指定远程分支名称,并且必须存在。

git checkout master
git branch -u upstream/remote-branch-name
Branch master set up to track remote branch remote-branch-name from upstream.

现在您应该收到git status

的统计数据
git status 
On branch master
Your branch is ahead of 'upstream/remote-branch-name' by 1 commit.
  (use "git push" to publish your local commits)
nothing to commit, working directory clean