Pull Request のレビュー時などリモートブランチを落としてくる際、毎回ブランチ名をコピペしてチェックアウトするのが地味に面倒なので peco でブランチを選択するだけでチェックアウトできるようにしました。
コマンド
git checkout $(git branch -a --sort=-authordate | cut -b 3- | grep -v -- "->" | peco | sed -e "s%remotes/origin/%%")
( 上の動画では oh-my-zsh のコマンドエイリアス で git コマンドを短縮しています )
追記 (2019/01/16)
コマンドをちょっと改良しました。
git branch -a --sort=-authordate | grep -v -e '->' -e '*' | perl -pe 's/^\h+//g' | perl -pe 's#^remotes/origin/##' | perl -nle 'print if !$c{$_}++' | peco | xargs git checkout
変更点:
- リモートブランチとローカルブランチをまとめて表示するようにしました。
- peco を
CTRL-C
などで中断した場合、そこでコマンドを終了するようにしました。 (git checkout
を走らせない) - GNU / BSD 環境を気にせず使えるようにする為に Perl を使うように置き換えました。
エイリアスを設定したい場合は .bashrc や .zshrc などに以下の関数定義を追記すれば gcop
でブランチを選択できるようになります。git checkout peco の略ですがお好みで。
gcop() {
git branch -a --sort=-authordate |
grep -v -e '->' -e '*' |
perl -pe 's/^\h+//g' |
perl -pe 's#^remotes/origin/##' |
perl -nle 'print if !$c{$_}++' |
peco |
xargs git checkout
}
パイプ中の各コマンドの解説
git branch -a --sort=-authordate
リモート追跡ブランチも含めたブランチ名の一覧を、ブランチの鮮度順に逆順ソートした状態で取得します。
grep -v -e '->' -e '*'
以下の2パターンの行を取り除きます。
- origin/HEAD の向き先が含まれている行:
- e.g.
origin/HEAD -> origin/master
- e.g.
- カレントブランチの行:
- e.g.
* develop
- e.g.
perl -pe 's/^\h+//g'
各行頭のスペースを削除します。
perl -pe 's#^remotes/origin/##'
#
はデリミタです。(スラッシュのエスケープ地獄を回避するためにスラッシュ以外をデリミタに使用。)
リモート追跡ブランチ名の先頭には remotes/origin/
が付きますが、これを含めた状態でそのままチェックアウトすると、ローカルブランチが作成されず、いわゆる detached HEAD な状態になってしまい不便なので取り除きます。
perl -nle 'print if !$c{$_}++'
ソートせずに重複行を取り除きます。