【问题标题】:Show number of unpushed commits on local (non-tracked) branch显示本地(非跟踪)分支上未推送的提交数
【发布时间】:2016-10-06 07:52:02
【问题描述】:

我已经在本地分支上工作了太久,没有向上游推送,也没有计算我在本地有多少提交。

我现在已准备好推送我的提交,但我需要 确切 我的提交数量以便用 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

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

所以我觉得卡住了。有大神可以指点一下吗?

【问题讨论】:

  • 如果您只有少数提交(比如少于 10 个左右),那么我会使用 git log 并计算您想要包含多少提交。如果你有几十个提交(糟糕的 Git 礼仪),那么可能有一种方法可以找到你最近 not 所做的提交,并且你可以从那里开始计数,假设你做了所有提交之后发生那一点。
  • git cherry -v origin/master | wc -l(但我不确定,这是最简单的方法)

标签: git github version-control


【解决方案1】:

我认为您在这里的根本问题可能在于您查看“提交的分支”(组成一个短语)的方式。或者,可能只是您限制了“上游”的概念。

让我用这个来说明:

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

这是分支master 上至少四个提交的绘图,masterorigin/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”。问题在于定义“某物”。

这是基本技巧:所有在masterorigin/master 上的提交,也在newbr 上。一次分支,包括多个本地和远程跟踪分支。

git status 计算“前面”和“后面”数字的方式是使用git rev-list --count,并使用“上游”设置排除当前分支上的提交和上游。所以在我们的第二个例子中,当master 是“领先1”时,masterorigin/master 都至少有最初的四个提交,但masterorigin/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 指向与masterorigin/master 相同的提交。因此您可以使用:

git push origin master:newbr

在远程origin 上创建newbr,指向本地master 指向的同一个提交。完成此操作后,origin/newbr 现在就存在了,所以现在您可以将其设置为 newbr 的上游。

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

git push origin a123456:refs/heads/newbr

当通过原始 SHA-1 哈希识别提交时,您应该像这样拼出完整的参考名称,因为 Git 无法再使用您的本地名称来确定您想要一个分支还是一个标签。)

【讨论】:

    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2020-09-26
      • 2016-02-22
      • 2013-04-26
      • 2022-01-04
      • 2015-07-24
      • 2020-03-01
      • 2014-02-04
      • 2011-03-13
      • 1970-01-01
      相关资源
      最近更新 更多