背景
複数のタスクを並行していて、
あっちのブランチに行ったりこっちのブランチに行ったりうろうろすることってあると思います
で、「gitあるある」かは知らんが、branchの移動って面倒ですよね。
branch名なんだっけ、となってgit branchして一覧確認して、branch名コピペしたり。
「branch名を補完すれば良かろう」という声は当然とし、
ただ結局そうしても、以下のような運用でブランチ作ってると、補完もろくに使えない。
(前方一致多すぎてtabキー押しても候補が多すぎてろくに省略できない(コピペの方が早い))
$git branch
develop
* feature/1129/modify_top_page
feature/1133/create_feature_summer_campaign
feature/1134/delete_test_code_in_mypage
・
・
・
もっというとbranch名の「modify_top_page」の方はわかっても「1129」のチケット番号の方は頭に浮かばん。
なんでこれを解決するために以下のようなコマンドを一個作って見た
まあ、作ったと行ってもエイリアスですが
コマンド
git jack
git transfor
とか git switch
とか考えたんすけど
git jack
ってなんか短くてかっこいい(?)ということでこうなった。
乗っ取るという意味合いのhijackから持ってきたんだけど、長いしhiでもないので
まあ造語に近いですね。
もっといい名前ないかな・・・・
効果
ローカルブランチから特定の文字列を検索し、そいつにチェックアウトする
$git branch
develop
* feature/1129/modify_top_page
feature/1133/create_feature_summer_campaign
feature/1134/delete_test_code_in_mypage
・
・
・
の時
$git jack summer
と入力すると
$git checkout feature/1133/create_feature_summer_campaign
上記と同じ効果をもつ(例外もあるが)
How do you
gitのエイリアス登録で実現した
具体的には「.gitconfig」に以下のような記述を追記した。
[alias]
jack = "!f(){ git branch | grep $1 | head -n1 | tr -d '* ' | xargs -t git checkout;};f"
解説
jack =
git jackってコマンドで実行される
"!f(){・・・・・・・;};f"
関数として定義し、紐付けるってことかな(よくわかってないけど、こうしないと動かなかった)
git branch | grep $1
git branchした結果を$1(シェルの引数)でgrepする
| head -n1 |
上の結果にパイプしてさらに先頭の一つだけ取得する(複数grepで引っかかった時のため)
| tr -d '* ' |
上の結果にパイプしてさらに'* 'といた文字列を削除する(現行のbranchには先頭に'* 'がつくため )
| xargs -t git checkout |
上の結果で該当のブランチが引っかかるので、パイプしてさらにxargsで、git checkout に引数として渡してやる
(tオプションはコマンド確認用、なくても良い)
雑感
とりあえず自分には便利
問題点としては、
「複数引っかかった時に最初にhitしたものになる」ということだけど、
まあできるだけユニークな名前をつけておけばいいんでないかな。(運用で回避)
対話式で選択させたりしてもいいかもだけど、そこまでコストかける意味もなさそうなので今回はここまで