前置き
gitのブランチ移動はエディタと連携したりSourcetreeのようなリッチなツールを試してみたりしている
gitのtab補完機能は勿論導入している
だがしかし、時にはコマンドラインでの作業中他のツールを開くのもめんどくさくてCLIでgit checkout
したくなる時がある
というかしている
そして仕事で使うgitリポジトリはfeatureとかissue番号とかがprefixに含まれてるので、
tab補完が活かせるほどブランチ名覚えてないんですよね...
**検索機能だからsearchとかブランチ名に入れた気がする...**みたいなノリで移動したい
忙しい人向け
~/.bashrcに下記のbash関数を書く
gc {ブランチ名}
で過去にcheckoutしたブランチに部分一致で移動できます
例えばgc dev
でdevelopブランチに移動
一致したブランチが複数ある場合はヒットしたブランチ名を全て表示します
リモートにしか存在しないブランチは部分一致で移動できません(頑張ってカスタマイズすればできると思いますが)
よくわからない人はbash alias 設定
でググってください
checkout_to_found_branch() {
if [ $# = 1 ] ; then
COUNT=`git branch | grep -c $1`
if [ "$COUNT" = "1" ] ; then
BRANCH=`git branch | grep $1`
git checkout ${BRANCH##* }
else
git branch | grep $1
fi
fi
}
gc() {
git checkout ${@:1} 2>/dev/null || checkout_to_found_branch ${@:1}
}
tab補完のアレに追記すればtab補完機能も有効にできます
# __git_complete git __git_mainとか書いてあるあたりに
__git_complete gc _git_checkout
解説
うろ覚えのシェルスクリプトです、普段シェル書かないので...改善案は大歓迎です
- bash関数を作成する
gc() {
git checkout ${@:1} 2>/dev/null || checkout_to_found_branch ${@:1}
}
自作関数gc (git checkoutのaliasのつもり) に渡した引数をgit checkout
に渡します
${@:1}
はシェルスクリプトにおける可変長引数なので、-bとかのオプションとかをどんな順番で渡しても問題なく動きます
2>/dev/null
は完全一致でブランチにヒットしなかった場合にエラーがターミナルに出力されないように殺しています
制御演算子||
を用いて通常のgit checkout
に失敗した場合自作の関数checkout_to_found_branch ${@:1}
を走らせます
つまり完全一致するブランチを指定したり -b オプションで新規にブランチを作成したりする分には、
純粋なgit checkout
のaliasとして機能します
自作の関数はその名の通り見つかったブランチにcheckout
checkout_to_found_branch() {
if [ $# == 1 ] ; then # オプション引数込みで何かして死んだときに動かないように、引数がブランチ名単一の時だけ動かす
# こんな保険は必要無いという豪の者は削除してif文のネストを減らそう
COUNT=`git branch | grep -c $1` # 部分一致するブランチ名をカウント
if [ "$COUNT" = "1" ] ; then # カウント結果が一つの場合
BRANCH=`git branch | grep $1`
git checkout ${BRANCH##* } # ヒットしたブランチにcheckout、
# 現在のブランチと同じブランチに無駄にcheckoutしても死なないように
# 検索結果の先頭に*があった場合は除外
else
git branch | grep $1 # カウント結果が複数ある場合一致したブランチ名を表示
fi
fi
}
意外とgit checkout 部分一致でググってもこれといった手法が出てこないので需要無いのだろうか...
取り敢えず自分が使う分にはこれで充分です、ブランチ切り替えでそんなに特殊な事しないので