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

Pha*_*e01 4 git branch

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

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

tor*_*rek 7

假设(或定义):通过跟踪分支,您指的是具有上游集的分支,并且该上游指的是远程跟踪名称。例如,如果分支developorigin/develop其上游,则该分支算作上游;但如果分支testdevelop设置为其上游,则该分支不算在内。

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

git fetch
Run Code Online (Sandbox Code Playgroud)

其次是:

git branch -vv | grep origin/
Run Code Online (Sandbox Code Playgroud)

输出将类似于:

* master          083378cc35 [origin/master] commit subject line
  xyz             8dbdf339cd [origin/xyz: ahead 1, behind 13] another subject line
Run Code Online (Sandbox Code Playgroud)

它告诉我们这master是最新的,但xyz与远程版本不同步。

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


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

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

git rev-list --count --left-right local...upstream
Run Code Online (Sandbox Code Playgroud)

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