列出未合并到其上游的分支
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}
如果两个条件都成立,打印分支名称。
参考资料
- gitrevisions man page
- Is there a better way to find out if a local git branch exists?
我想要一个类似于 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}
如果两个条件都成立,打印分支名称。
参考资料
- gitrevisions man page
- Is there a better way to find out if a local git branch exists?