git - 显示本地(非跟踪)分支上未推送提交的数量

标签 git github version-control

我在本地分支上工作太久了,没有 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 上至少四个提交的图,其中 masterorigin/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”。问题在于定义“某物”。

这是基本技巧: 所有在 masterorigin/master 上的提交,也在 newbr 上。 提交可以同时在多个分支上进行,包括多个本地和远程跟踪分支。
git status 计算“ahead”和“behind”数字的方法是使用 git rev-list --count ,并使用“upstream”设置来排除当前分支和上游的提交。所以在我们的第二个例子中,当 master 为“ahead 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

在远程 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/

相关文章:

xcode - 您可以禁用 Xcode 4 中的版本控制集成吗?

sql-server - 验证数据库更改(版本控制)

python - 是否可以从 python 中的 tar 包中提取单个文件

python - 如何将 gist 中的补丁应用到 Django 源代码?

git - 有什么办法可以将配置文件自动备份到 github 吗?

github - 如何从 github 中的矩阵触发单个部署 Hook ?

c - 在 git index 中添加了修改后的文件,但该文件未更改为暂存文件

Jenkins:如何设置GitHub组织下作业的周期扫描间隔?

GitHub 显示两次已重命名的目录

django - 在 git 项目中创建子模块