前のブランチをチェックアウトするのに git checkout の引数としてダッシュを使えるよ


git checkout コマンドの引数としてダッシュを使うと, 現在のブランチをチェックアウトする前のブランチをチェックアウトして戻ることができます.

Git のバージョンは 2.18.0 になります.

git checkout - で前のブランチに戻る

例えば, 現在 master ブランチと feature ブランチがあるとして, master ブランチをチェックアウトしているとします:

$ git branch
  feature
* master

git branch コマンドで表示されるブランチの前の * は今現在チェックアウトされているという意味です.

そして feature ブランチをチェックアウトします:

$ git checkout feature
Switched to branch 'feature'

ここで master ブランチをチェックアウトして master ブランチに戻る場合, git checkout master とすることもできますが, ダッシュ - を使うとチェックアウトする前のブランチを指定できるので - を使っても master ブランチをチェックアウトできます:

$ git checkout -
Switched to branch 'master'

ちなみに, もう一度 - を使うと feature ブランチをチェックアウトします:

$ git checkout -
Switched to branch 'feature'

このように - を使って, ブランチを交互にチェックアウトすることもできます.

-@{-1} の速記

ちなみに git checkout --@{-1} の速記です.

なので @{-1} を使っても前のセクションと同じことができます:

$ git branch
  feature
* master

$ git checkout feature
Switched to branch 'feature'

$ git checkout @{-1}
Switched to branch 'master'

$ git checkout @{-1}
Switched to branch 'feature'

@{-N} の意味

@{-1}-1 は一つ前にチェックアウトしたブランチを意味しますので, @{-2} となれば二つ前にチェックアウトしたブランチ, @{-3} となれば三つ前にチェックアウトしたブランチ, 同じ要領で @{-4}, @{-5}, @{-6}, @{-7}, @{-8}, @{-9}, @{-10}@{-N} と続けられます.

例 1) @{-2} で二つ前のブランチに戻る:

$ git branch
  a
  b
* master

$ git checkout a
Switched to branch 'a'

$ git checkout b
Switched to branch 'b'

$ git checkout @{-2}
Switched to branch 'master'

例 2) @{-3} で三つ前のブランチに戻る:

$ git branch
  a
  b
  c
* master

$ git checkout a
Switched to branch 'a'

$ git checkout b
Switched to branch 'b'

$ git checkout c
Switched to branch 'c'

$ git checkout @{-3}
Switched to branch 'master'

例 3) @{-10} で 10 個前のブランチに戻る:

$ git branch
  a
  b
  c
  d
  e
  f
  g
  h
  i
  j
* master

$ git checkout a
Switched to branch 'a'

$ git checkout b
Switched to branch 'b'

$ git checkout c
Switched to branch 'c'

$ git checkout d
Switched to branch 'd'

$ git checkout e
Switched to branch 'e'

$ git checkout f
Switched to branch 'f'

$ git checkout g
Switched to branch 'g'

$ git checkout h
Switched to branch 'h'

$ git checkout i
Switched to branch 'i'

$ git checkout j
Switched to branch 'j'

$ git checkout @{-10}
Switched to branch 'master'

- をマージやリベースでも使う

-@{-N} の使用は git checkout <branch><branch> だけにとどまりません.

次のようなマージやリベースでも使うことができます.

例 1) master ブランチをマージする:

$ git branch
  feature
* master

$ git checkout feature
Switched to branch 'feature'

$ git merge -

例 2) master ブランチを基に feature ブランチをリベースする:

$ git branch
  feature
* master

$ git checkout feature
Note: checking out 'feature'.

$ git rebase -

まとめ

git checkout - というコマンドは一つ前にチェックアウトしたブランチを再度チェックアウトする時に使えます.

さらに前のブランチをチェックアウトする場合は git checkout @{-N} で可能です.

また -@{-N} という表記法は git checkout コマンドにとどまらず, git mergegit rebase コマンドでも使うことができます.

ところで git checkout - というコマンド, シェルコマンドの cd - とよく似ていますね.

シェルコマンドの cd - は, cd する前のパスに cd するというものです.

また cd -cd -1 の速記です.

なので cd -N というように書くこともできます.

一例として次のように使えます:

$ pwd
/Users/yu8mada

$ cd workspace

$ pwd
/Users/yu8mada/workspace

$ cd -

$ pwd
/Users/yu8mada

なので cd - に馴染みのある方には, Git の git checkout - はとてもしっくりくる構文なのではないかなと思います.

Git のブランチのチェックアウト操作は日常的に行うものだと思いますので, git checkout <branch> に加えて git checkout -git checkout @{-N} も使っていけるといいですね.

参考資料