Using Git's @{-1} notation

There are a number of features Git has had for some time that go largely unnoticed by most people. Being able to refer to branches using the @{-1} notation (and its - alias) is one of the features I use on a regular basis that most people seem unaware of, even though they’ve been around since version 1.6.2.

Being able to refer to the previously checked out branch using a consistent notation is particularly handy if you tend to keep around a number of topic branches with similar enough names to make tab completion a bit of a hassle. When working on the Puppet codebase, for example, I will often have a number of branches of the form ${ticket}/${integration_branch}/${ticket_number}-${description}. Tab completing one of these can be annoying at times (especially with multiple tickets that are close together numerically and are intended for the same integration branch). Where @{-1} comes in handy is when I go to merge the topic branch into the integration branch to make sure it merges cleanly, and all the tests still pass.

% git checkout fix-instrumentation-file-case
Switched to branch 'fix-instrumentation-file-case'
# Time passes...
% git checkout 2.7.x
Switched to branch '2.7.x'
% git merge --no-ff @{-1}
Merge made by the 'recursive' strategy.
 .../{Instrumentable.rb => instrumentable.rb}       |    0
 1 files changed, 0 insertions(+), 0 deletions(-)
 rename lib/puppet/util/instrumentation/{Instrumentable.rb => instrumentable.rb} (100%)
% git log -1
commit 8735fea6c116e608292fbe294a622b5c09aed773
Merge: d4c8094 b2411b6
Author: Jacob Helwig <jacob@puppetlabs.com>
Date:   Mon Dec 26 04:08:56 2011

    Merge branch 'fix-instrumentation-file-case' into 2.7.x

    * fix-instrumentation-file-case:
      Use all lower-case file name for
      Puppet::Util::Instrumentation::Instrumentable

After running the tests, getting back to the topic branch for any further work is quite simple, using the - alias for @{-1}. For people used to using cd -, switching branches like this will probably come quite naturally.

% git checkout -
Switched to branch 'fix-instrumentation-file-case'

In addition to referring to the previously checked out branch @{-N} will refer to the Nth previously checked out branch (@{-2}, etc).