Jay Taylor's notes

back to listing index

Is there any way to git checkout previous branch?

[web search]
Original source (stackoverflow.com)
Tags: git branching howto stackoverflow.com
Clipped on: 2019-07-09

  1. Home
    1. Public
    2. Stack Overflow
    3. Tags
    4. Users
    5. Jobs
    1. Teams
      What’s this?

      Teams

      Q&A for Work

      Setup a private space for you and your coworkers to ask questions and share information.

      Learn more about Teams
    2. Q&A for Work
566

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?

I would like type UP arrow to find my previous git checkout command :p – Kit Ho Aug 26 '11 at 15:14
  • 11
    that involves moving your hands off the home position, typing gc- is WAY faster then pressing up until you find what you are looking for – Matt Briggs Aug 26 '11 at 16:00
  • @MattBriggs do you actually type gc- or was that shorthand for git checkout - – jewbix.cube Mar 5 '18 at 23:31
  • @jewbix.cube You need to learn about aliases, both for your shell and for git. – Gauthier Aug 17 '18 at 6:29
  • @KitHo: I find myself wanting to do that constantly, but the command I want may not even exist in the history if, for example, I just created the branch. – M_M Mar 4 at 15:19
  • 979

    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}.

    wow, I totally should have just tried it! figured - was a shell-ism, and that if the functionality was in git, it would be something different – Matt Briggs Aug 26 '11 at 16:17
  • This does not work well when you checkout a commit SHA twice, in which case @{-1} points to where you were before the first checkout.. – user716468 Mar 1 '13 at 0:32
  • I'm using ZSH, and I had to wrap @{-1} in quotes. Otherwise git choked: error: pathspec '@-' did not match any file(s) known to git. error: pathspec '@1' did not match any file(s) known to git. – Murphy Randle Feb 7 '14 at 23:12
  • 11
    This is probably the first time a SO answer has made me smile uncontrollably. Thought this would be so much harder! – Owen Nov 9 '15 at 0:08
  • 19
    Extra kudos for the pedagogy used: Show the general facility, then mention the compact but less general shorthand! … I quite often use @{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 converse git log ..@{u} which is just the local commits that aren't pushed yet. – Benjohn Nov 23 '16 at 9:03
  • 158

    The simplest way of doing this nowadays is:

    git checkout -
    

    ... which is an alias of:

    git checkout @{-1}
    

    Image (Asset 3/11) alt=

    Perfect. I was looking up what the git way to do this was so I could create this exact alias. Glad to see it just exists. – Tabitha Jun 23 '16 at 21:56
  • Is there a way to list the previous branches without checking them out? – Erotemic Jun 8 '17 at 13:56
  • @Erotemic using bash - for i in{1..10}; do git rev-parse --symbolic-full-name @{-$i}; done – Bonsaigin Sep 20 '17 at 14:50
  • Amazing to see the 'git checkout -' alias is a thing! That is exactly the ux I was looking for :) – www.debug.coach Dec 28 '17 at 20:35
  • @Erotemic in powershell it would be 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 – Mariusz Pawelski Nov 4 '18 at 0:46
  • 27

    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

    3

    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 -
    
    answered Aug 2 '17 at 16:34
    Just a heads-up that ohmyz is super slow compared to other zsh package managers. I would recommend taking a look at antigen or zplug. – spex May 10 '18 at 16:44
  • In case it’s not clear, this works because Oh My Zsh’s Git plugin defines gco as a short way of writing git checkout. So gco - just calls git checkout -. – Rory O'Kane Jan 16 at 23:12
  • offcourse my friend. needless to explain its git checkout -. for failsafe updated. – Venkat.R Jan 17 at 2:05
  • 1

    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, @{-<n>}, e.g. @{-1} means “the nth branch/commit checked out before the current one.” The documentation for git checkout <branch> reiterates: “You can use the @{-N} syntax to refer to the N-th last branch/commit checked out using git checkout operation.”

    • For the <branch> argument of git checkout, “you may also specify ‘-’ which is synonymous to ‘@{-1}’.”

    answered Jan 16 at 23:07
    Image (Asset 6/11) alt= Question feed