如何判断分支是否已经合并
判断分支是否已合并:git branch --merged 列出已合并分支(目标分支在列即已合并);精确判断用 git merge-base --is-ancestor <分支> main && echo merged;看远程分支用 git branch -r --merged。
两种检查方式:列出式的 git branch --merged main——出现在列表里就是已合并;脚本式的 git merge-base --is-ancestor feature-x main && echo "已合并"(退出码 0 即已合并),适合写进自动化。
交互检查
git checkout main
git branch --merged # 已合并进 main 的本地分支
git branch --no-merged # 还没合并的(这些要留意)
git branch -r --merged # 远程分支版本
精确判断(脚本友好)
if git merge-base --is-ancestor feature-x main; then
echo "feature-x 已合并进 main"
else
echo "未合并"
fi
原理:分支的顶端提交是 main 的祖先 = 它的所有提交都在 main 里。
注意 squash merge 的坑
GitHub 的 Squash and merge 把分支提交压成一个新提交——原分支提交并未进入 main,--merged 和 --is-ancestor 都会显示"未合并"!这时判断要看内容是否等价:
git cherry main feature-x # 带 - 前缀的表示改动已在 main 中
squash 合并的分支删除时用 git branch -D(-d 会拒绝)。
常见问题(FAQ)
Q:--merged 显示已合并就能安全删除吗?
基本可以(-d 也是同样判断逻辑)。唯一例外:分支还被其他未合并分支依赖,或指向的提交是某 tag 的祖先之外的特殊用途。
Q:能查"什么时候合并的"吗?
git log --merges --oneline main | grep 分支名 找合并提交;git log --grep="分支名" --oneline main 也常有线索。
Q:远程分支怎么批量清理未合并的?
反过来用:git branch -r --no-merged main 列出未合并的远程分支,逐个确认是进行中还是该删。