我正在多个跟踪分支的 git 存储库中工作,到一天结束时,我不知道是否将所有工作推送到所有分支中。
是否有一个 git 命令显示哪些分支未推送,以便我可以签出并进行拉取,必要时合并,然后推送?
假设(或定义):通过跟踪分支,您指的是具有上游集的分支,并且该上游指的是远程跟踪名称。例如,如果分支develop
有origin/develop
其上游,则该分支算作上游;但如果分支test
已develop
设置为其上游,则该分支不算在内。
在这种情况下可能使用的命令序列是:
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.prune
为true
,但这与此处的其他所有内容无关。)
可以编写一个更奇特的脚本,仅打印名称,跳过同步的分支,等等。如果您想这样做,请使用枚举命名空间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)
前面的计数将是第一个打印的数字,后面的计数将是第二个。