如何查看已合并到 master 分支的所有分支?Git 分支清理指南
文章目录
- [如何查看已合并到 master 分支的所有分支?Git 分支清理指南](#如何查看已合并到 master 分支的所有分支?Git 分支清理指南)
-
- [1. 核心命令:`git branch --merged`](#1. 核心命令:
git branch --merged) - [2. 查看远程分支的合并状态](#2. 查看远程分支的合并状态)
- [3. 排除主分支本身](#3. 排除主分支本身)
- [4. 安全删除已合并的本地分支](#4. 安全删除已合并的本地分支)
- [5. 处理远程分支](#5. 处理远程分支)
- [6. 关于主分支名称的差异](#6. 关于主分支名称的差异)
- [7. 为什么有些分支明明合并了却没出现在列表中?](#7. 为什么有些分支明明合并了却没出现在列表中?)
- [8. 高级技巧:使用 `git for-each-ref` 进行更灵活的查询](#8. 高级技巧:使用
git for-each-ref进行更灵活的查询) - [9. 最佳实践建议](#9. 最佳实践建议)
- [10. 总结](#10. 总结)
- [1. 核心命令:`git branch --merged`](#1. 核心命令:
在日常开发中,我们通常会基于主分支( master 或 main)创建功能分支,完成开发后合并回主分支,然后继续新的迭代。久而久之,本地会积累大量已经合并过的"僵尸"分支,不仅让 git branch 的输出变得臃肿,还可能在你切换分支时带来困惑。因此,掌握如何查看已合并分支并适时清理,是保持仓库整洁的重要技能。
本文将围绕"查看已合并到 master 的分支"这一需求,从基础命令到批量清理,提供完整的操作指南。
1. 核心命令:git branch --merged
最直接、最常用的命令是:
bash
git branch --merged master
这条命令会列出所有本地 分支中,其提交历史已经完全包含在 master 分支历史里的分支。换句话说,这些分支上的所有改动都已经通过合并(或变基)进入了 master,不再有任何独有提交。
输出示例:
feature/login
feature/payment
* master
hotfix/1.0.1
注意:
master本身也会出现在列表中,因为它的历史当然包含自身。星号*表示当前所在分支。
2. 查看远程分支的合并状态
如果你也想查看远程跟踪分支(例如 origin/feature/login)是否已合并到 master,可以加上 -r 或 -a 参数:
bash
# 仅查看远程分支
git branch -r --merged master
# 查看所有分支(本地 + 远程)
git branch -a --merged master
这对于判断某个远程分支是否已经被上游合并、是否可以安全删除远程引用很有帮助。
3. 排除主分支本身
在输出的列表中,我们通常不想把自己也删掉。因此,在列出所有已合并分支时,经常会使用 grep -v 过滤掉主分支:
bash
git branch --merged master | grep -v "master" | grep -v "\*"
grep -v "master"排除名为master的行;grep -v "\*"排除当前分支标记(如果有星号的话)。
如果你使用的是 main 作为主分支,自然要替换成 grep -v "main"。
4. 安全删除已合并的本地分支
找到那些已经完成使命的分支后,下一步就是删除它们。Git 提供了安全的删除命令:
bash
git branch -d <branch-name>
-d 选项会检查该分支是否已完全合并到当前分支(或指定分支),如果是则允许删除,否则会报错警告,防止误删未合并的工作。
结合上面的过滤,你可以一键删除所有已合并到 master 的本地分支(请务必先确认列表无误):
bash
git branch --merged master | grep -v "master" | xargs git branch -d
警告:执行前建议先不加
xargs,仅打印列表,确认没有重要分支后再执行删除操作。
5. 处理远程分支
删除远程分支则使用 git push 命令:
bash
git push origin --delete <branch-name>
如果你要批量删除远程已合并分支,可以结合 git branch -r --merged 并小心处理(注意不要删除 origin/master 本身)。一个更稳妥的做法是先在本地删除跟踪分支,然后推送删除指令。
6. 关于主分支名称的差异
近些年来,许多新仓库默认使用 main 作为主分支。如果你的仓库是这种情况,请将所有命令中的 master 替换为 main,例如:
bash
git branch --merged main
7. 为什么有些分支明明合并了却没出现在列表中?
这种情况通常有两个原因:
- 分支尚未被拉取到本地 :远程分支合并后,本地可能没有执行
git fetch,导致本地仓库不知道远程的合并结果。可以先git fetch --prune更新远程引用。 - 合并方式不是"快进"或常规合并 :如果采用
--squash合并,或者通过变基(rebase)后再合并,分支的提交历史可能不完全包含在master中,此时--merged可能不会认为该分支已合并。此时需要手动确认,再决定是否删除。
8. 高级技巧:使用 git for-each-ref 进行更灵活的查询
git branch --merged 已经足够,但如果你需要更精细的控制(例如按最后提交时间过滤),可以使用 git for-each-ref 配合 --merged 选项:
bash
git for-each-ref --merged master --format="%(refname:short)" refs/heads/
这个命令只输出本地分支名称,方便进一步脚本处理。
9. 最佳实践建议
- 合并后立即删除 :在功能分支合并到
master后,养成习惯立即删除本地和远程分支,避免积累。 - 定期全局清理 :每隔几周执行一次
git branch --merged master检查,并用git branch -d清理。 - 使用 git fetch --prune :定期执行
git fetch --prune清理本地已过时的远程跟踪分支(那些远程已被删除的分支)。 - 谨慎对待
-D:git branch -D是强制删除,即使分支未合并也会删除,请仅在确定数据无用时使用。
10. 总结
| 需求 | 命令 |
|---|---|
| 查看本地已合并到 master 的分支 | git branch --merged master |
| 查看远程已合并的分支 | git branch -r --merged master |
| 排除主分支自身 | `git branch --merged master |
| 安全删除已合并的本地分支 | git branch -d <branch> |
| 批量删除已合并分支(谨慎) | `git branch --merged master |
掌握这些命令,你的 Git 仓库将始终保持清爽,分支管理也会更加高效。下次当你运行 git branch 看到仅剩几个活跃分支时,相信你会有一种井井有条的满足感。