如何列出已合并到所有指定多个Git分支的分支?
如何列出已合并到所有指定分支的Git分支?
git branch --merged或git for-each-ref --merged的多参数逻辑是或(只要分支合并到任意一个指定分支就会被列出),而非你需要的且(必须合并到所有指定分支)。这里提供几种更简洁且扩展性更好的方案:
1. 基于git merge-base的命令行脚本
直接遍历所有本地分支,检查每个分支的尖端提交是否是所有目标分支的祖先(即该分支已合并到所有目标分支):
# 替换a、b、c为你的目标分支,可任意添加更多 git for-each-ref refs/heads/ --format='%(refname:lstrip=2) %(objectname)' | while read branch commit; do all_merged=true for target in a b c; do if ! git merge-base --is-ancestor "$commit" "$target"; then all_merged=false break fi done if $all_merged; then echo "$branch" fi done
逻辑说明:
git for-each-ref refs/heads/ --format='%(refname:lstrip=2) %(objectname)':输出所有本地分支名及其尖端提交的哈希值git merge-base --is-ancestor $commit $target:检查分支的尖端提交是否是目标分支的祖先(等价于该分支已合并到目标分支)- 只有当所有目标分支都满足条件时,才输出该分支名
2. 封装为Git别名(推荐)
为了日常使用更便捷,可以把上述逻辑封装成Git别名:
打开你的.gitconfig文件,添加以下内容:
[alias] branches-merged-all = "!f() { \ for branch in $(git for-each-ref refs/heads/ --format='%(refname:lstrip=2)'); do \ commit=$(git rev-parse "$branch"); \ all_merged=true; \ for target in \"$@\"; do \ if ! git merge-base --is-ancestor \"$commit\" \"$target\"; then \ all_merged=false; \ break; \ fi; \ done; \ if $all_merged; then echo \"$branch\"; fi; \ done; \ }; f"
之后只需执行以下命令就能列出同时合并到多个目标分支的分支:
git branches-merged-all 目标分支1 目标分支2 目标分支N
对比原始方案的优势
- 无需多次调用Git命令、排序或使用
comm工具,逻辑更直观 - 支持任意数量的目标分支,添加/修改目标分支只需调整参数
- 可轻松扩展额外逻辑:比如排除特定分支(在遍历分支时添加
if [ "$branch" = "main" ]; then continue; fi即可)
内容的提问来源于stack exchange,提问作者DBear
相关产品推荐
相关产品推荐

