1. 概述

在多人协作开发中,经常会出现一些已经合并到主分支的分支保留在远程仓库中,导致分支列表臃肿、难以维护。本文将介绍如何清理这些已合并的 Git 分支,包括远程和本地分支。

2. 示例准备

我们先创建两个分支:一个已合并,一个未合并,用于后续验证删除命令是否正确执行。

2.1 创建一个未合并的分支

首先创建一个名为 not-merged-branch 的分支,并提交一个空提交:

$ git checkout -b not-merged-branch
$ git commit --allow-empty -m "commit on not merged branch"
$ git push -u origin not-merged-branch

该分支不会被合并到 main 分支中。

2.2 创建并合并一个分支

切换回 main 分支,并创建一个新的分支 fully-merged-branch

$ git switch main
$ git checkout -b fully-merged-branch
$ git commit --allow-empty -m "commit on fully merged branch"
$ git push -u origin fully-merged-branch

再次切换回 main 分支,并将 fully-merged-branch 合并进来:

$ git switch main
$ git merge origin/fully-merged-branch
$ git push

这样就完成了分支的创建与合并。

3. 构建删除命令

3.1 列出已合并的远程分支

使用以下命令列出所有已合并到当前分支的远程分支:

$ git branch -r --merged

输出示例:

  origin/HEAD -> origin/main
  origin/fully-merged-branch
  origin/main

说明:

  • -r 表示只列出远程分支
  • --merged 表示只列出已合并到当前本地分支的远程分支

如果当前不在 main 分支上,也可以指定合并目标:

$ git branch -r --merged main

3.2 排除不删除的分支

通常我们不希望删除 maindevelop 这类主干分支。使用 grep -v 过滤掉这些分支:

$ git branch -r --merged | grep -v 'main\|develop'

输出示例:

  origin/fully-merged-branch

3.3 删除远程分支

清理分支名称前缀 origin/,然后批量删除:

$ git branch -r --merged | grep -v 'main\|develop' | sed 's/origin\///' | xargs -n 1 git push --delete origin

输出示例:

To [repository address]
 - [deleted]         fully-merged-branch

✅ 这一步成功删除了远程已合并的分支。

验证远程分支是否还存在:

$ git branch -r

输出示例:

  origin/HEAD -> origin/main
  origin/develop
  origin/main
  origin/not-merged-branch

fully-merged-branch 已被删除。

3.4 删除本地已合并的分支

查看本地分支:

$ git branch

输出示例:

  develop
  fully-merged-branch
* main
  not-merged-branch

虽然远程分支已删除,但本地分支仍存在。我们需要手动或自动清理这些分支。

3.4.1 更新本地远程分支引用

先执行 git fetch --prune 清理本地对远程分支的引用:

$ git fetch --prune

3.4.2 删除本地无远程对应的分支

使用以下命令删除本地中远程已删除的分支:

$ git branch -vv | grep ': gone]' | awk '{print $1}' | xargs -n 1 git branch -d

输出示例:

Deleted branch fully-merged-branch (was 401eb4f).

✅ 本地分支也已清理完毕。

验证:

$ git branch

输出示例:

  develop
* main
  not-merged-branch

3.4.3 仅删除本地已合并分支(不依赖远程)

如果只想删除本地已合并的分支(不依赖远程状态),可以使用:

$ git branch --merged | grep -v 'main\|develop' | xargs -n 1 git branch -d

4. 总结

本文介绍了如何清理 Git 仓库中已合并的分支,包括:

  • ✅ 列出已合并的远程分支
  • ✅ 过滤掉主干分支(如 main、develop)
  • ✅ 删除远程分支
  • ✅ 删除本地中远程已删除的分支
  • ✅ 单独清理本地已合并分支

通过这些步骤,可以有效保持仓库的整洁,避免分支爆炸带来的维护成本。


附录:常用命令汇总

操作 命令
查看已合并远程分支 git branch -r --merged
排除主干分支 grep -v 'main|develop'
删除远程分支 xargs -n 1 git push --delete origin
删除本地无远程分支 git branch -vv | grep ': gone]' | awk '{print $1}' | xargs -n 1 git branch -d
删除本地已合并分支 git branch --merged | grep -v 'main|develop' | xargs -n 1 git branch -d

建议集合本文,作为 Git 清理分支的标准操作手册。


原始标题:Delete All Git Branches Which Have Been Merged