如何列出在git中未推送的所有本地跟踪分支?

4
我在一个git代码库的多个跟踪分支上工作,但到一天结束时,我不知道是否将所有工作都推送到了所有分支上。
有没有一个git命令可以显示哪些分支没有被推送,这样我就可以切换到该分支并执行拉取操作,必要时进行合并,然后再进行推送?
1个回答

7
假定(或定义):通过“跟踪分支”您指的是具有上游设置的分支,并且该上游引用远程跟踪名称。例如,如果分支develop具有origin/develop作为其上游,则计算其中一个;但是,如果分支test将develop设置为其上游,则不予计算。
在这种情况下使用的可能命令序列如下:
git fetch

接着是:

git branch -vv | grep origin/

输出将类似于以下内容:
* master          083378cc35 [origin/master] commit subject line
  xyz             8dbdf339cd [origin/xyz: ahead 1, behind 13] another subject line

上述内容告诉我们,master已经是最新版本,但是xyz与它的远程分支不同步。

请注意,如果所讨论的上游(upstream)不叫做origin,你需要相应更改grep命令。 你可能还需要多运行一次git fetch,或者你可以使用git fetch --all。 (你也可以使用git fetch --prune或将fetch.prune设置为true,但这与这里的其他所有内容无关。)


可以编写一个更高级的脚本,仅打印名称,跳过已同步的分支等等。 如果您想要这样做,请使用git for-each-ref枚举refs/heads/命名空间中的引用。 这些是您的分支名称。 对于每个名称,测试是否有上游配置,并获取其上游的哈希ID(hash ID)。 将其与分支的哈希ID进行比较。 另外,检查上游是本地分支(例如上面的test示例,其中上游是develop)还是远程跟踪名称。

如果上游远程跟踪名称,并且本地名称和上游的哈希ID不同,则该分支与其远程对应分支不同步。 要获取前进和/或后退计数,请使用:

git rev-list --count --left-right local...upstream

前面的计数器将是第一个打印的数字,后面的计数器将是第二个。


1
这个假设是绝对正确的,让我们来看看 git branch -vv | grep origin/ 足以查看应该推送到其远程分支副本的哪些分支。 - Phate01

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接