2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

部分一致でgit checkoutしたい

Last updated at Posted at 2020-02-19

前置き

gitのブランチ移動はエディタと連携したりSourcetreeのようなリッチなツールを試してみたりしている
gitのtab補完機能は勿論導入している

だがしかし、時にはコマンドラインでの作業中他のツールを開くのもめんどくさくてCLIでgit checkoutしたくなる時がある
というかしている

そして仕事で使うgitリポジトリはfeatureとかissue番号とかがprefixに含まれてるので、
tab補完が活かせるほどブランチ名覚えてないんですよね...
**検索機能だからsearchとかブランチ名に入れた気がする...**みたいなノリで移動したい

忙しい人向け

~/.bashrcに下記のbash関数を書く
gc {ブランチ名}で過去にcheckoutしたブランチに部分一致で移動できます
例えばgc devでdevelopブランチに移動
一致したブランチが複数ある場合はヒットしたブランチ名を全て表示します
リモートにしか存在しないブランチは部分一致で移動できません(頑張ってカスタマイズすればできると思いますが)
よくわからない人はbash alias 設定でググってください

.bashrc
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補完機能も有効にできます

/Library/Developer/CommandLineTools/usr/share/git-core/git-completion.bash
# __git_complete git __git_mainとか書いてあるあたりに
__git_complete gc _git_checkout

解説

うろ覚えのシェルスクリプトです、普段シェル書かないので...改善案は大歓迎です

  1. bash関数を作成する
.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

.bash
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 部分一致でググってもこれといった手法が出てこないので需要無いのだろうか...
取り敢えず自分が使う分にはこれで充分です、ブランチ切り替えでそんなに特殊な事しないので

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?