列出未合并到其上游的分支

List branches not merged to their upstream

我想要一个类似于 git branch 的命令,它将列出 所有 未与 他们的 合并的本地分支上游。

这是 git branch 知道的,因为 git branch -d <branch-name> 对于未合并的分支将失败。

你在找这个吗:

git branch --no-merged

以上命令将列出所有未合并到当前分支的分支。如果你需要检查其他分支那么

git branch --no-merged master

您还可以通过指定 -r 标志和要检查的 ref 来比较上游分支,ref 可以是本地的也可以是远程的:

git branch -r --no-merged origin/master

git for-each-ref 有一个 "upstream" 字段,可以显示分支是否与其上游保持同步。然后您可以过滤其输出以仅显示那些领先于上游的输出:

$ git for-each-ref --format='%(upstream:trackshort)..%(refname:short)' | awk -F '\.\.' '~/>/{print }'

这会跳过没有上游的分支,如果不是您需要的,请修改过滤器(</code> 在 awk 记录中为空)。 <code>".." 用作分隔符,因为您不能在引用名称中包含序列

据我所知,没有一个内置的 Git 命令可以列出其上游分支(如果有)之后的所有本地分支。但是,您可以使用现有的 Git 命令实现所需的功能。见下文。

脚本

#!/bin/sh

# git-bbu.sh
#
# List the local Branches Behind their Upstream branch, if any.
#
# Usage: git bbu
#
# To make a Git alias called 'bbu' out of this script,
# put the latter on your search path, and run
#
#   git config --global alias.bbu \
#       '!sh git-bbu.sh'

if [ $# -ne 0 ]; then
    printf "%s\n\n" "usage: git bbu"
    exit 1
fi

git for-each-ref --format='%(refname:short)' refs/heads | \
    while read ref; do
      if (git rev-parse --verify --quiet "$ref"@{upstream} &&
          ! git diff --quiet "$ref"..."$ref"@{upstream}) \
              >/dev/null 2>&1; then
        printf "%s\n" "$ref"
      fi
    done

说明

运行

git for-each-ref --format='%(refname:short)' refs/heads

列出所有本地分支(为什么不在这里使用 git branch?因为在脚本中,您应该尝试使用管道 Git 命令而不是瓷器命令)。将其通过管道传输到 while 循环,并且对于每个这样的本地分支,

  • 检查本地分支是否有上游分支,使用

    git rev-parse --verify --quiet "$ref"@{upstream}
    
  • 检查本地分支是否在其上游分支之后,使用(的逻辑否定)

    git diff --quiet "$ref"..."$ref"@{upstream}
    

如果两个条件都成立,打印分支名称。

参考资料