据我所知,在发布此答案时,没有直接的 Git 命令或选项。
但是,受grep using output from another command 的启发,您可以使用grep 获取远程分支refname 列表中缺少的本地分支refname 的列表:
$ grep -v -F -f <(git for-each-ref --format='%(refname:lstrip=2)' refs/heads) <(git for-each-ref --format='%(refname:lstrip=3)' refs/remotes/origin) | grep -vF HEAD
例子:
$ git branch
feature/C
feature/D # local-only branch, not pushed to remote
* master
$ git branch -r
origin/HEAD -> origin/master
origin/develop # no corresponding branch on local
origin/feature/A # no corresponding branch on local
origin/feature/B # no corresponding branch on local
origin/feature/C # is already on local
origin/master # is already on local
$ grep -v -F -f <(git for-each-ref --format='%(refname:lstrip=2)' refs/heads) <(git for-each-ref --format='%(refname:lstrip=3)' refs/remotes/origin) | grep -vF HEAD
develop
feature/A
feature/B
命令的结构是:
$ grep -v -F -f <(command 2) <(command 1)
-
command 2列出所有本地分行$ git for-each-ref --format='%(refname:lstrip=2)' refs/heads
feature/C
feature/D
master
-
command 1列出所有拿来的远程分支$ git for-each-ref --format='%(refname:lstrip=3)' refs/remotes/origin
HEAD
develop
feature/A
feature/B
feature/C
master
-f <(command 2) 告诉grep 从command 1(远程分支模式)的输出中搜索command 2(本地分支模式)的输出中的模式。那应该返回已经有相应本地分支的远程分支,然后 -v 选项反转结果。管道 git -vF HEAD 仅用于排除 HEAD。
您也可以使用 git branch,但我更喜欢使用 git for-each-ref 来编写脚本和自动化。请参阅有关 Git 的 "plumbing" vs "porcelain" commands 之间区别的相关帖子。
这可能并不总是有效因为:
为方便起见,我通过 git fetch 调用将它变成了一个常规的 shell 别名:
$ alias git-new-branches="git fetch; grep -v -F -f <(git for-each-ref --format='%(refname:lstrip=2)' refs/heads) <(git for-each-ref --format='%(refname:lstrip=3)' refs/remotes/origin) | grep -vF HEAD"
$ git-new-branches
develop
feature/A
feature/B
您可能更愿意将其转换为 shell 脚本,embed that into a Git alias。