Gitで前に戻る(prev)/次に進む(next)エイリアス
gitで一個前に戻るには、
$ git checkout HEAD^
とすればよい。
しかし、次に進む、というコマンドはない。
gitは「ブランチ」が可能なので、「次」は複数あり、「次」と言われても、「どの次」なのかが分からないからだ。
ただし、ブランチをmaster/mainに限定した場合には、状況が異り、「どの次」かが特定できるようになる。
単純にコードの履歴をパワポのように、前に戻したり次に進めたりしたい場面はある。
誰かに、「こういうふうにコードを変えていったんだよ」と説明する場面である。
git show
で事足りることもあるが、差分だけではコードの全体が見づらくなってしまう。
Bruno Michelという方が、こういった場面に対応するgit aliasを 書いてくれているのを見つけ、 使ってみると社内の発表のときに非常に役に立ったので、ここで少し改造したバージョンを紹介しておきたい。
[alias]
prev = checkout HEAD^1
next = "!sh -c 'if [ \"$1\" = \"\" ]; then if [ \"$TARGET_BRANCH\" = \"\" ]; then if [ \"$(git branch | grep master)\" = \"\" ]; then TARGET_BRANCH=main; else TARGET_BRANCH=master; fi; fi; else TARGET_BRANCH=$1; fi; git log --reverse --pretty=%H $TARGET_BRANCH | grep $(git rev-parse HEAD) -A 1 | tail -1 | xargs git checkout' -"
これを、${HOME}/.gitconfig
に書いておくと、git next
で次のコミットに移動し、git prev
で前のコミットに移動するようになる。
git next
で言うところの「次」の意味だが、デフォルトの挙動はmasterの履歴上の「次」であり、もしmasterがないときは、
mainブランチの「次」を探そうとする。
デフォルトブランチの名前がmasterでもmainでもない場合には、環境変数TARGET_BRANCHにブランチ名を設定することで、挙動をオーバーライドできる。
明示的に引数を与え、git next <branch-name>
とすることもできる。
実際の発表では、もっと高速に移動するために(パワポでは下キーを押すだけなのだ)、一時的に、更に次のようにaliasして使用した。
alias n="git next"
alias p="git prev"