Git 批量删除 Branch & Tag 操作手册
在 git bash 中执行命令。
一、批量删除远程 Branches(仅已合并到主分支的)
完整流程:
# 1. 更新远程信息,并清理本地已删除的远程分支引用
git fetch --prune
# 2. 切换到主分支(假设是 master,也可能是 main)
git checkout master
git pull origin master
# 3. 列出所有已合并到 master 的远程分支,按前缀筛选,预览待删除列表
git branch -r --merged origin/master | grep 'origin/release/2025' | sed 's/ *origin\///'
# 4. 确认无误后执行删除
git branch -r --merged origin/master | grep 'origin/release/2025' | sed 's/ *origin\///' | xargs -I {} git push origin --delete {}
关键点: – --merged origin/master 确保只删除已合并到主分支的分支 – sed 's/ *origin\///' 去掉 origin/ 前缀和行首空格 – 使用 git push origin --delete {} 比 git push origin :{} 更可读
二、批量删除远程 Tags
按前缀删除远程 Tag:
# 1. 先预览要删除的 tag
git ls-remote --tags origin | grep 'refs/tags/release-2025' | awk '{print $2}'
# 2. 确认无误后执行删除
git ls-remote --tags origin | grep 'refs/tags/release-2025' | awk '{print ":" $2}' | xargs git push origin
三、清理本地多余的 Tags(远程已删除但本地还有的)
# 1. 更新远程信息并清理本地已删除的远程分支引用
git fetch --prune
# 2. 预览本地有但远程没有的 tag
diff <(git tag | sort) <(git ls-remote --tags origin | awk '{print $2}' | sed 's#refs/tags/##' | sort) | grep '^<' | awk '{print $2}'
# 3. 确认无误后删除
diff <(git tag | sort) <(git ls-remote --tags origin | awk '{print $2}' | sed 's#refs/tags/##' | sort) | grep '^<' | awk '{print $2}' | xargs git tag -d
原理:本地所有 tag 减去远程所有 tag,得到远程已删除的 tag。
四、按时间筛选删除
Git 原生不支持按时间筛选 branch、tag,但可以结合 shell 实现,以2025年之前为例。
删除指定日期之前且已合并的远程分支:
# 预览
git branch -r --merged origin/master --sort=committerdate --format='%(refname:short) %(committerdate:short)' | grep 'origin/' | awk '$2 < "2025-01-01" {print $1}' | sed 's#origin/##'
# 删除
git branch -r --merged origin/master --sort=committerdate --format='%(refname:short) %(committerdate:short)' | grep 'origin/' | awk '$2 < "2025-01-01" {print $1}' | sed 's#origin/##' | xargs -I {} git push origin --delete {}
删除指定日期之前的远程 tag:
# 预览
git for-each-ref --sort=taggerdate --format='%(refname:short) %(taggerdate:short)' refs/tags | awk '$2 < "2025-01-01" {print $1}'
# 删除
git for-each-ref --sort=taggerdate --format='%(refname:short) %(taggerdate:short)' refs/tags | awk '$2 < "2025-01-01" {print ":" $1}' | xargs git push origin
五、安全操作检查
| 步骤 | 说明 |
|---|---|
| ① 先预览 | 在删除命令前先用 `awk ‘{print $1}’` 看列表 |
| ② 小范围测试 | 先挑一两个手动删,确认无误再批量 |
| ③ 备份 | 批量操作前 `git tag -l > tags_backup.txt` 备份列表 |
| ④ 防误删 | 分支删除务必加 `–merged`,tag 务必核对前缀 |