如何删除所有已合并的Git分支

如何删除所有已合并的Git分支

技术背景

在使用Git进行项目开发时,会创建许多分支用于不同功能的开发、测试等。当这些功能完成并合并到主分支后,为了保持本地和远程仓库的整洁,需要删除这些已合并的分支。但在删除过程中,需要注意保留重要的分支,如mastermaindevelop等。

实现步骤

列出已合并的本地分支

可以使用以下命令列出本地已合并的分支:

1
git branch --merged

如果不想删除某些重要分支,如mastermaindev,可以使用grep命令过滤:

1
git branch --merged | grep -Ev "(^\*|^\+|master|main|dev)"

删除已合并的本地分支

将过滤后的分支列表传递给git branch -d命令进行删除:

1
git branch --merged | grep -Ev "(^\*|^\+|master|main|dev)" | xargs --no-run-if-empty git branch -d

删除单个本地分支

使用以下命令删除单个已合并的本地分支:

1
git branch -d branchname

如果要强制删除未合并的分支,使用:

1
git branch -D branchname

删除远程分支

使用以下命令从远程仓库删除分支:

1
2
3
git push --delete origin branchname
# 旧版本Git使用
git push origin :branchname

删除远程分支后,可以使用以下命令清理远程跟踪分支:

1
git remote prune origin

或者使用以下命令清理单个远程跟踪分支:

1
git branch -dr branchname

删除所有已合并的远程分支

1
2
3
git branch -r --merged | grep -v master | sed 's/origin\//:/' | xargs -n 1 git push origin
# 较新版本Git使用
git branch -r --merged | grep -v master | sed 's/origin\///' | xargs -n 1 git push --delete origin

核心代码

创建Git别名

可以创建一个Git别名sweep来简化删除已合并分支的操作:

1
git config --global alias.sweep '!git branch --merged $([[ $1 != "-f" ]] && git rev-parse master) | egrep -v "(^\*|^\s*(master|develop)$)" | xargs git branch -d'

使用方法:

1
2
3
git sweep
# 强制删除已合并到当前分支的分支
git sweep -f

PowerShell脚本

在Windows上使用PowerShell删除本地已合并分支:

1
2
3
4
5
6
7
8
function Remove-MergedBranches
{
git branch --merged |
ForEach-Object { $_.Trim() } |
Where-Object { $_ -NotMatch "^*" } |
Where-Object { -not ( $_ -Like "*master" -or $_ -Like "*main" ) } |
ForEach-Object { git branch -d $_ }
}

或者使用短版本:

1
git branch --merged | %{$_.trim()}  | ?{$_ -notmatch 'dev' -and $_ -notmatch 'master' -and $_ -notmatch 'main'} | %{git branch -d $_.trim()}

Ruby脚本

使用Ruby脚本删除本地和远程已合并分支:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#!/usr/bin/env ruby

current_branch = `git symbolic-ref --short HEAD`.chomp
if current_branch != "master"
if $?.exitstatus == 0
puts "WARNING: You are on branch #{current_branch}, NOT master."
else
puts "WARNING: You are not on a branch"
end
puts
end

puts "Fetching merged branches..."
remote_branches= `git branch -r --merged`.
split("\n").
map(&:strip).
reject {|b| b =~ /\/(#{current_branch}|master)/}

local_branches= `git branch --merged`.
gsub(/^\* /, '').
split("\n").
map(&:strip).
reject {|b| b =~ /(#{current_branch}|master)/}

if remote_branches.empty? && local_branches.empty?
puts "No existing branches have been merged into #{current_branch}."
else
puts "This will remove the following branches:"
puts remote_branches.join("\n")
puts local_branches.join("\n")
puts "Proceed?"
if gets =~ /^y/i
remote_branches.each do |b|
remote, branch = b.split(/\//)
`git push #{remote} :#{branch}`
end

# Remove local branches
`git branch -d #{local_branches.join(' ')}`
else
puts "No branches removed."
end
end

最佳实践

  • 创建别名:使用git config创建别名,简化删除已合并分支的命令。
  • 过滤重要分支:在删除分支时,使用grep或正则表达式过滤重要分支,避免误删。
  • 测试命令:在执行删除命令前,可以先使用echo命令测试要删除的分支列表。

常见问题

  1. 误删分支:如果不小心删除了重要分支,可以使用git reflog查找分支的最后一次提交,然后使用git branch恢复分支。
  2. 删除未合并分支:如果使用git branch -d删除未合并的分支,Git会提示错误。可以使用git branch -D强制删除。
  3. 远程分支未同步:删除远程分支后,本地的远程跟踪分支可能仍然存在。可以使用git remote prune origin清理。

如何删除所有已合并的Git分支
https://119291.xyz/posts/2025-05-13.how-to-delete-all-merged-git-branches/
作者
ww
发布于
2025年5月13日
许可协议