I sort of want the equivalent of cd -
for git. If I am in branch master
and I checkout foo
, I would love to be able to type something like git checkout -
to go back to master
, and be able to type it again to return to foo
.
Does anything like this exist? Would it be hard to implement?
gc-
or was that shorthand for git checkout -
From the release notes for 1.6.2
@{-1} is a way to refer to the last branch you were on. This is accepted not only where an object name is expected, but anywhere a branch name is expected and acts as if you typed the branch name. E.g. git branch --track mybranch @{-1}, git merge @{-1}, and git rev-parse --symbolic-full-name @{-1} would work as expected.
and
git checkout - is a shorthand for git checkout @{-1}.
The simplest way of doing this nowadays is:
git checkout -
... which is an alias of:
git checkout @{-1}
https://i.stack.imgur.com/bBm6f.jpg
If you want to know more about this, I wrote an entire article about it here: Checkout The Previous Branch In Git.
for i in{1..10}; do git rev-parse --symbolic-full-name @{-$i}; done
git reflog | ? { $_ -match ': checkout: moving from (.*) to (.*)'} | % { $Matches[1] }
. In bash you have to write something equivalent (get reflog and filter it to lines containing ": checkout:" string and then extract branch name). This is actually what git does
Git version 2.23
introduced the git switch
command which you can use to do that (and more). Quoting the official documentation:
Switch to a specified branch. The working tree and the index are updated to match the branch. All new commits will be added to the tip of this branch.
In your specific case you can issue git switch -
to go back to the branch you were previously on. You can execute the same command again to return to the first branch.
P.S. It's not that you don't already know how to do that (I mean it's been 7 years since you asked this question), but this command is less confusing and friendly to beginners as it addresses a common confusion that arises when using git checkout
.
As @Karl points out and from git checkout
manual:
As a special case, the "@{-N}" syntax for the N-th last branch checks out the branch (instead of detaching). You may also specify - which is synonymous with "@{-1}".
So both git checkout -
and git checkout @{-1}
would work in this case
Closest I believe is using the
git reflog
and parse the latest
moving from branch1 to branch2
and
git checkout branch1
I landed to this question with the same thought to checkout my previous branch. I'm using ohmyz in Mac
. Below command helped me.
$ gco -
$ git checkout -
gco
as a short way of writing git checkout
. So gco -
just calls git checkout -
.
git checkout -
. for failsafe updated.
Just adding some more detail to the previous answers to understand the mechanism by which git checkout @{-N}
works. It walks the reflog to inspect the checkout history, so if you wanted to implement something similar on your own you should be able to parse the output of git reflog
looking for checkout:
lines. You can check the implementation in the git source sha1_name.c
, specifically the function interpret_nth_prior_checkout
.
The most popular solution is:
git checkout @{-N}
Where N - step count of the branches to move back on the checkout history.
Here are pointers to the parts of Git’s documentation that describe the git checkout -
and git checkout @{-1}
solutions given by the other answers:
When specifying a Git revision for any command, @{-
For the
Success story sharing
error: pathspec '@-' did not match any file(s) known to git. error: pathspec '@1' did not match any file(s) known to git.
@{-1}
in quotes.git checkout -
worked just fine, though.@{u}
, which is the upstream branch of the current branch. It's very useful for e.g.git log @{u}..
which lists upstream commits that aren't pulled yet. And the conversegit log ..@{u}
which is just the local commits that aren't pushed yet.