Namespaced helpers for git branches29 Mar 2015
git everyday and I often need to switch between branches, create one
when I start a feature, then delete it afterwards. I need to know which branch
I'm currently in, and the list of all available branches.
The bare git commands to do all that are not the easiest to remember.
Sometimes you have to call
git branch, sometimes it's
git checkout or
I've created a bunch of aliases to prevent me from having to remember the exact
commands, and abstracting them under a
git branch-* namespace. I now simply
need to type
git branch-list to list all my branches,
git branch-delete foo
to delete the
foo branch or
git branch-exists bar to check if the
Quick note about aliases
You can create aliases in two different ways. Either you create a new entry in
~/.gitconfig file under the
[alias] section, or you create a new
script file in your
$PATH whith a name starting with
git-. By creating
git-foo script, you can invoke it by running
git foo automatically.
I've opted for the second approach as it makes writing non-trivial scripts easier, and it gives an easy access to potential arguments. Also note that all git scripts are run from your git root.
Display all the branches
This one is easy and git provides an easy way to call it. It will display
a list of all the local branches, and the current one will be prefixed with
$ git branch-list * develop master release
#!/usr/bin/env bash # git-branch-list git branch $@
Note that we pass the
$@ to the initial call to allow passing optional
--all to also get remote branches).
What is the current branch ?
Instead of displaying the whole list of all available branches, you might simply need to know what the current branch is.
$ git branch-current develop
#!/usr/bin/env bash # git branch-current git rev-parse --abbrev-ref HEAD 2>/dev/null
This one is a little trickier. To get the name of the current branch, we need
to ask git the unambiguous name of the current
HEAD, which happens to be the
name of the current branch. Note that in detached head mode, this command will
Does the branch
foo exists ?
Git also provides a top-level command to get this information. This will return
an exit code of
0 if the branch exists,
$ git branch-exists foo $ echo $? 1 $ git branch-exists master $ echo $? 0
#!/usr/bin/env bash # git-branch-exists git show-branch $1 &>/dev/null
Note that we simply pass the name of the branch to test as the
and hide any output the command might create. I suggest you configure your
terminal prompt so you can easily see if the last command was a success or not.
There are two ways to create branches in git. Either simply creating it and staying on your current one, or creating one and switching to it. I've decided that my alias should do the second command, because more often than not, when I need to create a new branch, I also need to switch to it.
$ git branch-create foo Switched to a new branch 'foo'
#!/usr/bin/env bash # git-branch-create git checkout -b $1
This one is easy too, we've simply aliased
git branch-create to the
checkout -b we're used to call.
Deleting the local
We're talking here about deleting a local branch. We'll see how to delete a remote branch in the next part.
$ git branch-delete foo Deleted branch foo (was 05d51b4).
#!/usr/bin/env bash # git branch-delete git branch -D $1
This one is pretty easy too, we've simply aliased
git branch-delete to
Deleting the remote
Now we want to delete the
foo branch from the remote.
$ git branch-remove-remote foo To email@example.com:user/repo - [deleted] foo
#!/usr/bin/env bash # git branch-remove-remote git push origin --delete $1
This version of the alias is pretty simple and only allows deleting branches
origin. If you want to be able to delete branches from other remotes,
have a look at the complete script I'm using.
What I really like about those aliases is how they add consistency to the git
command. Instead of using
git show-branch or
git branch for
commands that deals with branches, we've adding a namespace and we're now only
using command that starts with
git branch-. If you have git command
autocompletion, this makes using them much much pleasant.
I have aliases to do the same kind of things for tags and remotes, but I'll detail them in a future post.
Tags : #git
Want to add something ? Feel free to get in touch on Twitter : @pixelastic