github - How can I delete all Git branches which have been merged?

ID : 347

viewed : 66

Tags : gitgithubversion-controlbranchfeature-branchgit

Top 5 Answer for github - How can I delete all Git branches which have been merged?

vote vote

99

UPDATE:

You can add other branches to exclude like master and dev if your workflow has those as a possible ancestor. Usually I branch off of a "sprint-start" tag and master, dev and qa are not ancestors.

First, list locally-tracking branches that were merged in remote (you may consider to use -r flag to list all remote-tracking branches as suggested in other answers).

git branch --merged 

You might see few branches you don't want to remove. we can add few arguments to skip important branches that we don't want to delete like master or a develop. The following command will skip master branch and anything that has dev in it.

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

If you want to skip, you can add it to the egrep command like the following. The branch skip_branch_name will not be deleted.

git branch --merged| egrep -v "(^\*|master|main|dev|skip_branch_name)" 

To delete all local branches that are already merged into the currently checked out branch:

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

You can see that master and dev are excluded in case they are an ancestor.


You can delete a merged local branch with:

git branch -d branchname 

If it's not merged, use:

git branch -D branchname 

To delete it from the remote use:

git push --delete origin branchname  git push origin :branchname    # for really old git 

Once you delete the branch from the remote, you can prune to get rid of remote tracking branches with:

git remote prune origin 

or prune individual remote tracking branches, as the other answer suggests, with:

git branch -dr branchname 
vote vote

81

To delete all branches on remote that are already merged:

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

In more recent versions of Git

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

UPDATE (by @oliver; since does not fit in comment, but enough answers already): if you are on branch ABC then ABC will appear in the results of git branch -r --merged because the branch is not specified, so branch defaults to current branch, and a branch always qualifies as merged to itself (because there are no differences between a branch and itself!).

So either specify the branch:

git branch -r --merged master | grep -v master ... 

OR first checkout master:

git checkout master | git branch -r --merged | grep -v ... 
vote vote

79

Just extending Adam's answer a little bit:

Add this to your Git configuration by running git config -e --global

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

And then you can delete all the local merged branches doing a simple git cleanup.

vote vote

70

You'll want to exclude the master, main & develop branches from those commands.

Local git clear:

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

Remote git clear:

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

Sync local registry of remote branches:

git fetch -p 
vote vote

50

This also works to delete all merged branches except master.

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

Top 3 video Explaining github - How can I delete all Git branches which have been merged?

Related QUESTION?