Git unlike Mercurial has no builtin support for closing branches. This leads to a proliferation of branches and running
git branch -a to view remote branches or
git branch will show ever more branches. Actually, closing a branch in Git can be supported through the use of tags. We decide to keep the tag for future use, so that we can use it to check out a new branch from this tag. Another way would of course be to just delete a brach local and/or remote, but that is not the same as closing a branch. Closing a branch in Mercurial still makes it possible to reopen it again for later work. Anyways, in this article, I will show two aliases which can be used to close a branch, either both local and remote or just remote.
Put the following into the [alias] section of your .gitConfig file:
closebranch = "!w() { echo Attempting to close local and remote branch: $1 Processing...; echo Checking the branch $1 out..; git checkout $1; echo Trying to create a new tag archive/$1; git tag archive/\"$1\"; git push origin archive/\"$1\"; echo Deleting the local branch $1; git branch -d $1; echo Deleting the remote branch $1; git push origin --delete $1; echo Done. To restore the closed branch later, enter: git checkout -b MyNewBranch archive/\"$1\"; }; w"
closebranchpassive = "!w() { echo Attempting to close local and remote branch: $1 Processing...; echo Checking the branch $1 out..; git checkout $1; echo Trying to create a new tag archive/$1; git tag archive/\"$1\"; git push origin archive/$1; echo Deleting the local branch $1; echo Deleting the remote branch $1; echo Done. To restore the closed branch later, enter: git checkout -b MyNewBranch archive/\"$1\"; }; w"
closeremotebranch = "!w() { echo Attempting to close remote branch: $1 Processing...; echo Checking the branch $1 out..; git checkout $1; echo Trying to create a new tag archive/$1; git tag archive/\"$1\"; git push origin archive/\"$1\"; echo Deleting the remote branch $1; git push origin --delete $1; echo Done. To restore the closed branch later, enter: git checkout -b MyNewBranch archive/\"$1\"; }; w"
What we do here is the following:
- Check out the branch to close
- Tag this branch as archive/branchname
- Important - push the tag the remote e.g. origin in the provided aliased commands above
- (Delete the local branch)
- Delete the remote branch
- Display a friendly output message how to restore the branch later through a tag
What we use here is a
shell function in each alias. This allows us to do multiple commands in Git through a simple aliased command. Say you want to close a local and remote branch called MyBranchToBeClosed. Just enter:
git closebranch MyBranchToBeClosed
If you just want to close the remote branch and keep the local one, enter:
git closeremotebranch MyBranchToBeClosed
To restore the branch MyBranchToBeClosed (which now is actually closed!) later, just enter:
git checkout -b MyRestoredBranch archive/MyBranchToBeClosed
This lets you keep old branch around as tags and not proliferate the branch listings. We however have moved the branch(es) over to tags prefixed with archive/
I wish Git was simpler to use sometimes so we did not have to use such hacks, closing branches should be easy.