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

How do I list all local tracking branches not pushed in git?

我在多个跟踪分支的 git 存储库中工作,到一天结束时,我不知道我是否将我的所有工作推送到所有分支中。

是否有 git 命令显示哪些分支未被推送,以便我可以检出并进行拉取,必要时合并然后推送?

假设(或定义):通过tracking branch你的意思是一个有上游集的分支,and上游指的是一个远程跟踪名称。例如,如果分支 developorigin/develop 作为它的上游,那一个算;但如果分支 testdevelop 设置为其上游,则该分支不计算在内。

在这种情况下可能使用的命令序列是:

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 与其远程副本不同步。

请注意,如果有问题的上游未命名为 origin,您将需要相应地更改 grep 命令。您可能还需要多个 git fetch,或者您可能想要使用 git fetch --all。 (您可能还想使用 git fetch --prune 或将 fetch.prune 设置为 true,但这与此处的其他所有内容无关。)


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

如果上游 远程跟踪名称并且本地名称和上游的哈希 ID 不同,则分支与其远程副本不同步。要获得领先 and/or 的计数,请使用:

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

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