git branch --merged 列出的分支不一定安全删除,因其仅基于提交图可达性判断“已合并”,不校验内容是否被真正应用、是否被 revert、是否经 squash/rebase 合并,也忽略远程状态与工程交付实际。

git branch --merged 会列出所有已合并到当前分支的本地分支,但这个“已合并”只看提交对象的可达性,不校验内容是否真正被应用或是否冲突过。
为什么 git branch --merged 显示的分支不一定安全删除
Git 判断“已合并”的逻辑是:目标分支的最新提交是否能从当前分支的 HEAD 沿父提交链一路追溯到。只要路径存在,就认为已合并——哪怕那个分支里有 revert 提交、手动 cherry-pick 过、或者合并后又反向修复过。
- 比如
feature/login被合并进main,之后你又在main上用git revert撤销了它,git branch --merged仍会显示feature/login—— 因为原始合并提交还在历史里 - 如果某分支只 cherry-pick 过几个提交,没走 merge,它不会出现在
--merged列表里,即使功能已上线 -
--merged不检查远程分支状态,origin/feature/x即使已被远端删除,只要本地引用还存在,也可能被误判
git branch --no-merged 的真实用途
它不是“找待合并分支”的银弹,而是快速定位那些明显还没碰过当前主线的分支。适合在清理前做初筛,但不能替代人工确认。
批量替换指定目录下所有 Git 仓库的远程地址(remote URL)。 当用户需要将 Git 仓库从一个服务器迁移到另一个服务器时使用。 触发词:git remote 替换、git url 批量修改、git 仓库迁移、更换 git 地址、批量修改 remote url。
- 输出为空 ≠ 所有工作都合完了;可能只是某些分支被 merge --squash 了(产生单个新提交,无合并提交记录)
- 它对 rebase 过的分支也失效:rebase 后的提交 SHA 完全不同,Git 认为“不可达”
- 想查某个特定分支是否合并进当前分支,直接用
git merge-base --is-ancestor <branch> HEAD</branch>更可靠
查远程分支合并状态必须加 -r 或显式指定上游
git branch --merged 默认只扫本地分支。远程分支要单独处理:
-
git branch -r --merged无效 ——git branch -r是独立命令,不接受--merged - 正确做法:
git branch -r --contains origin/main(查哪些远程分支包含 main 的最新提交),或反过来:git merge-base origin/main origin/feature/y看是否有共同祖先 - 更实用的是:
git log --oneline --cherry-pick --right-only origin/main...origin/develop,能看出 develop 有哪些提交没出现在 main 里
真正决定一个分支能否删,得结合 PR 状态、CI 结果、部署记录一起看。--merged 只是 Git 层面的图论判断,离工程意义上的“已交付”差得很远。










