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

我有很多Git分支。 如何删除已经合并的分行? 有一个简单的方法来删除它们,而不是一个一个地删除它们吗?

更新:

如果您的工作stream将这些分支作为可能的祖先,那么您可以添加其他分支来排除master和dev。 通常我会分出一个“sprint-start”的标签,而master,dev和qa不是祖先。

要删除已经合并到当前签出分支中的所有本地分支:

 git branch --merged | egrep -v "(^\*|master|dev)" | xargs git branch -d 

你可以看到,主人和开发者被排除在外的情况下,他们是一个祖先。


您可以删除合并的本地分支:

 git branch -d branchname 

如果没有合并,请使用:

 git branch -D branchname 

要在旧版本的Git中从远程删除它,请使用:

 git push origin :branchname 

在更新的Git版本中使用:

 git push --delete origin branchname 

一旦从远程删除分支,您可以删除远程跟踪分支:

 git remote prune origin 

或修剪个别的远程追踪分支,如其他答案所示:

 git branch -dr branchname 

希望这可以帮助。

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

 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 

只是稍微扩展Adam的答案:

通过运行git config -e --global将其添加到您的Gitconfiguration中

 [alias] cleanup = "!git branch --merged | grep -v '\\*\\|master\\|develop' | xargs -n 1 git branch -d" 

然后你可以删除所有的本地合并分支做一个简单的git cleanup

这也可以删除除master以外的所有合并分支。

 git branch --merged | grep -v '^* master$' | grep -v '^ master$' | xargs git branch -d 

你会想从这些命令中排除masterdevelop分支。

本地git明确:

 git branch --merged | grep -v '\*\|master\|develop' | xargs -n 1 git branch -d 

远程git明确:

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

同步远程分支的本地registry:

 git fetch -p 

对于那些在Windows上,喜欢PowerShell脚本的人,这里是一个删除本地合并分支:

 function Remove-MergedBranches { git branch --merged | ForEach-Object { $_.Trim() } | Where-Object {$_ -NotMatch "^\*"} | Where-Object {-not ( $_ -Like "*master" )} | ForEach-Object { git branch -d $_ } } 

Git Sweep在这方面做得很好。

您可以将提交添加到–merged选项。 这样,你可以确保只删除合并到的分支,即原点/主

以下命令将从您的原点删除合并的分支。

 git branch -r --merged origin/master | grep -v "^.*master" | sed s:origin/:: |xargs -n 1 git push origin --delete 

你可以testing哪个分支将被删除,replacegit push origin – 用echo删除

 git branch -r --merged origin/master | grep -v "^.*master" | sed s:origin/:: |xargs -n 1 echo 

我使用下面的Ruby脚本来删除我已经合并的本地和远程分支。 如果我为一个具有多个遥控器的存储库进行操作,并且只想从一个遥控器中删除,我只需在遥控列表中添加一个select语句即可获得我想要的遥控器。

 #!/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 2.5.0版本:

 git branch -d `git branch --merged` 

kuboon的答案错过了在分支名称中删除具有master主字段的分支。 以下对他的回答进行了改进:

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

当然,它并不删除“主”分支本身:)

Git中没有任何命令会自动为您执行此操作。 但是你可以编写一个使用Git命令的脚本来为你提供所需的东西。 这可以通过多种方式来完成,具体取决于您使用的分支模型。

如果你需要知道一个分支是否已经被合并到master中,如果myTopicBranch已经被合并(即你可以删除它),下面的命令将不会产生输出。

 $ git rev-list master | grep $(git rev-parse myTopicBranch) 

你可以使用Git分支命令,parsingBash中的所有分支,并对所有分支进行for循环。 在这个循环中,你可以使用上面的命令来检查是否可以删除分支。

git branch --merged | grep -Ev '^(. master|\*)' | xargs -n 1 git branch -d git branch --merged | grep -Ev '^(. master|\*)' | xargs -n 1 git branch -d将删除当前所有分支和/或master分支。

对于那些希望了解这些命令的人来说,这里有一篇有用的文章: Git Clean:删除已经合并的分支,作者:Steven Harman 。

如何删除PowerShell控制台中的合并分支

 git branch --merged | %{git branch -d $_.Trim()} 

请参阅Windows的GitHub

你可以使用git-del-br 工具 。

 git-del-br -a 

你可以使用pip来安装它

 pip install git-del-br 

PS:我是这个工具的作者。 任何build议/意见,欢迎。

亚当的更新答案的别名版本:

 [alias] branch-cleanup = "!git branch --merged | egrep -v \"(^\\*|master|dev)\" | xargs git branch -d #" 

此外,看到这个答案为转义复杂的别名方便的提示。

尝试以下命令:

git branch -d $(git branch --merged | grep -vw $(git rev-parse --abbrev-ref HEAD))

通过使用git rev-parse将获得当前分支名称以排除它。 如果你有错误,这意味着没有地方分支去除。

要对远程分支执行相同操作(使用远程名称更改origin ),请尝试:

git push origin -vd $(git branch -r --merged | grep -vw $(git rev-parse --abbrev-ref HEAD) | cut -d/ -f2)

如果你有多个遥控器,添加grep origin | 之前cut只过滤origin

如果上述命令失败,请尝试先删除合并的远程跟踪分支:

git branch -rd $(git branch -r --merged | grep -vw $(git rev-parse --abbrev-ref HEAD))

然后git fetch再次git fetch远程并再次使用以前的git push -vd命令。

如果您经常使用它,请考虑将其作为别名添加到~/.gitconfig文件中。

如果您错误地删除了一些分支,请使用git reflog来查找丢失的提交。

基于这些答案我做了我自己的Bash脚本也做到了 !

它使用git branch --mergedgit branch -d删除已合并的分支,并在删除之前提示您为每个分支。

 merged_branches(){ local current_branch=$(git rev-parse --abbrev-ref HEAD) for branch in $(git branch --merged | cut -c3-) do echo "Branch $branch is already merged into $current_branch." echo "Would you like to delete it? [Y]es/[N]o " read REPLY if [[ $REPLY =~ ^[Yy] ]]; then git branch -d $branch fi done } 

我使用git-flow esque命名scheme,所以这对我来说非常安全:

 git branch --merged | grep -e "^\s\+\(fix\|feature\)/" | xargs git branch -d 

它基本上寻找以stringfix/feature/开始的合并提交。

如果您想删除已经合并到您当前所在分支的所有本地分支机构,则基于较早的答案,我已经提出了一个安全的命令:

 git branch --merged | grep -v \* | grep -v '^\s*master$' | xargs -t -n 1 git branch -d 

这个命令不会影响你当前的分支或你的主分支。 它还会在使用xargs的-t标志之前告诉你它在做什么。

编写一个脚本,在这个脚本中,Git检出所有已经合并为主的分支。

然后做git checkout master

最后,删除合并的分支。

 for k in $(git branch -ra --merged | egrep -v "(^\*|master)"); do branchnew=$(echo $k | sed -e "s/origin\///" | sed -e "s/remotes\///") echo branch-name: $branchnew git checkout $branchnew done git checkout master for k in $(git branch -ra --merged | egrep -v "(^\*|master)"); do branchnew=$(echo $k | sed -e "s/origin\///" | sed -e "s/remotes\///") echo branch-name: $branchnew git push origin --delete $branchnew done 

为了避免意外地从主控以外的其他分支运行命令,我使用下面的bash脚本。 否则,运行git branch --merged | grep -v "\*" | xargs -n 1 git branch -d git branch --merged | grep -v "\*" | xargs -n 1 git branch -d git branch --merged | grep -v "\*" | xargs -n 1 git branch -d从已经被合并的master的分支可以删除master分支。

 #!/bin/bash branch_name="$(git symbolic-ref HEAD 2>/dev/null)" || branch_name="(unnamed branch)" # detached HEAD branch_name=${branch_name##refs/heads/} if [[ $branch_name == 'master' ]]; then read -r -p "Are you sure? [y/N] " response if [[ $response =~ ^([yY][eE][sS]|[yY])$ ]]; then git branch --merged | grep -v "\*" | xargs -n 1 git branch -d fi else echo "Refusing to delete branches that are not merged into '$branch_name'. Checkout master first." fi 

要删除已经合并到主分支的本地分支,我使用下面的别名( git config -e --global ):

 cleanup = "!git branch --merged master | grep -v '^*\\|master' | xargs -n 1 git branch -D" 

我正在使用git branch -D来避免error: The branch 'some-branch' is not fully merged. 消息,而我目前的结帐不同于主分支。

Windoze友好的Python脚本(因为Wesnoth仓库中的git-sweep窒息):

 #!/usr/bin/env python # Remove merged git branches. Cross-platform way to execute: # # git branch --merged | grep -v master | xargs git branch -d # # Requires gitapi - https://bitbucket.org/haard/gitapi # License: Public Domain import gitapi repo = gitapi.Repo('.') output = repo.git_command('branch', '--merged').strip() for branch in output.split('\n'): branch = branch.strip() if branch.strip(' *') != 'master': print(repo.git_command('branch', '-d', branch).strip()) 

https://gist.github.com/techtonik/b3f0d4b9a56dbacb3afc

如果您正在使用分支模型(如HubFlow或GitFlow),则可以使用此命令删除合并的function分支:

git branch --merged | grep feature.* | grep -v "\*" | xargs -n 1 git branch -d

如果你想删除已经合并的地方分行,并删除他们的遥控器这里是我喜欢的一行:

 git branch --merged | xargs -I_br -- sh -c 'git branch -d _br; git push origin --delete _br' 
 for b in $(git branch -a | grep -v "\(master\|remotes\)"); do \ git branch -D $b; done && git fetch -p 

比方说,我有一个远程命名上游和一个起源(GitHub风格,我的叉子是起源,上游是上游)。

我不想删除任何主人,头,或任何上游。 我也不想删除开发分支,因为这是我们从中创buildPR的通用分支。

列出所有的远程分支,按合并后的分支进行过滤:

 git branch -r 

从列表中删除包含我知道在分支名称中的词的行我不想删除:

 sed '/develop\|master\|HEAD\|upstream/d' 

从引用名称中删除远程名称(origin / somebranch变成somerranch):

 sed 's/.*\///' 

使用xargs来调用一行代码:

 xargs git push --delete origin 

把它们一起pipe起来,你会得到:

 git branch -r --merged | sed '/develop\|master\|HEAD\|upstream/d' | sed 's/.*\///' | xargs git push --delete origin 

这将使我只有一些我曾经工作过的分支,但没有合并。 您可以逐一删除它们,因为不应该有太多。

find你不再想要的分支:

 git branch -ar 

说你find你想要删除的branch1,branch2和branch3:

 git push --delete origin branch1 branch2 branch3 

我的Bash脚本贡献是基于mmrobin的答案松散。

它需要一些有用的参数指定包括和排除,或检查/删除只有本地或远程分支,而不是两者。

 #!/bin/bash # exclude branches regex, configure as "(branch1|branch2|etc)$" excludes_default="(master|next|ag/doc-updates)$" excludes="__NOTHING__" includes= merged="--merged" local=1 remote=1 while [ $# -gt 0 ]; do case "$1" in -i) shift; includes="$includes $1" ;; -e) shift; excludes="$1" ;; --no-local) local=0 ;; --no-remote) remote=0 ;; --all) merged= ;; *) echo "Unknown argument $1"; exit 1 ;; esac shift # next option done if [ "$includes" == "" ]; then includes=".*" else includes="($(echo $includes | sed -e 's/ /|/g'))" fi current_branch=$(git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/') if [ "$current_branch" != "master" ]; then echo "WARNING: You are on branch $current_branch, NOT master." fi echo -e "Fetching branches...\n" git remote update --prune remote_branches=$(git branch -r $merged | grep -v "/$current_branch$" | grep -v -E "$excludes" | grep -v -E "$excludes_default" | grep -E "$includes") local_branches=$(git branch $merged | grep -v "$current_branch$" | grep -v -E "$excludes" | grep -v -E "$excludes_default" | grep -E "$includes") if [ -z "$remote_branches" ] && [ -z "$local_branches" ]; then echo "No existing branches have been merged into $current_branch." else echo "This will remove the following branches:" if [ "$remote" == 1 -a -n "$remote_branches" ]; then echo "$remote_branches" fi if [ "$local" == 1 -a -n "$local_branches" ]; then echo "$local_branches" fi read -p "Continue? (y/n): " -n 1 choice echo if [ "$choice" == "y" ] || [ "$choice" == "Y" ]; then if [ "$remote" == 1 ]; then remotes=$(git remote) # Remove remote branches for remote in $remotes do branches=$(echo "$remote_branches" | grep "$remote/" | sed "s/$remote\/\(.*\)/:\1 /g" | tr -d '\n') git push $remote $branches done fi if [ "$local" == 1 ]; then # Remove local branches locals=$(echo "$local_branches" | sed 's/origin\///g' | tr -d '\n') if [ -z "$locals" ]; then echo "No branches removed." else git branch -d $(echo "$locals" | tr -d '\n') fi fi fi fi 

如果您从本地计算机上删除,这是我的直接方式:

只需进入: C:\Repo\your-project\.git\refs\heads

每个分支是在这个文件夹下创build的文件,只是删除与您的分支名称匹配的文件。

在Windows上很难find一种方法。 我只是想通过这种方式,它确实救了我的Windows安装。