Ghislain Rodrigues

Delete merged branches

In Git, because a branch is only a reference to a commit, once it is merged, there is no use keeping it.

However, with time it is possible to end up with a lot of old branches if they haven't been deleted as they were merged.

Delete a single branch

To delete a local branch, run:

git branch -d branchName

the -d option stands for delete. If the branch is not merged in the branch you are currently checked out on, the deletion will fail (to prevent you from losing commits), if you still want to delete it, use the -D option instead of -d, to force the deletion.

To delete a remote branch, run:

git push origin :branchName

The colon is what triggers the deletion, more information about it in the official doc of git push (man git-push), in the options section about the argument.

Delete multiple branches

When deleting branches, any number of branches can be passed (eg git branch -d branch1 branch2 branch3 and git push origin :branch1 :branch2 :branch3) but if you have a lot, it can be a hassle. So let's script all that.

First, we need the merged branches:

git branch --merged

This lists the branches merged in the branch you currently are on, so make sure you are on master (or on the relevant branch for you).

To list the remote branches which are merged, the -r option is needed:

git branch -r --merged

It also includes the branch you are on, so we want to exclude it:

git branch --merged | egrep -v '(master|any|other|branches|you|want|to|keep)'

For the remote branches only, it will display them with the remote name, let's clean it (I use origin here, use the remote name you use) and add the colon:

git branch -r --merged | egrep -v '(master)' | sed -e 's#origin/# :#g'

Also, if you have more than one origin, you will want to filter on a specific one:

git branch -r --merged | grep 'yourRemoteName/' | ...

Finally, we need to use this command to generate the list of branches to delete. It then needs to be fed to the delete command:

# local branches
git branch -d $(git branch --merged | egrep -v '(master)')

# remote branches
git push origin $(git branch -r --merged | egrep -v '(master)' | sed -e 's#origin/# :#g')

Forget about deleted branches

When someone deletes a remote branch, the other clones of the project don't see them as deleted. To stop keeping track of the deleted branches, run:

git fetch -p origin

or

git remote update -p

The -p option stands for prune and in my opinion should always be used, for the sake of your clone's tidiness.