n番煎じ備忘録

主に技術系の自分用備忘録,大体n番煎じ.

fzfを利用してgitコマンドの使い勝手を向上する

やりたいこと

頻繁に利用するgitコマンドの使い勝手を向上する.具体的には以下を達成したい.

  • ローカルブランチをブランチ一覧からインタラクティブに選択しチェックアウトする
  • リモートブランチを〃
  • ローカルブランチの一覧を表示し,インタラクティブに選択して削除する

環境

参考

実装

ローカルブランチをブランチ一覧からインタラクティブに選択しチェックアウトする

alias gchl="git branch | fzf | xargs git checkout"
  • シンプルなワンライナーで実行可能なのでこのようにalias登録でOK

リモートブランチをブランチ一覧からインタラクティブに選択しチェックアウトする

function gchr() {
  git fetch -p
  local branch
  branch=$(git branch -r | fzf | awk '{print $1}')
  if [[ -n "${branch}" ]]; then
    branch=${branch#origin/}
    git checkout ${branch}
  fi
}

(関数の構成はこちらの内容をそのまま参考にしています)

  • fzfの出力は origin/hogeのような文字列になるので
    • awk '{print $1}'により先頭の空白を削除
    • ${branch#origin/}により前方一致でorigin/部分を削除(シェルの変数展開についてはこちらの記事が詳しい)

ローカルブランチのうち,すでにリモートブランチで削除されたものの一覧を表示し,インタラクティブに選択して削除する

function gbd() {
  git fetch -p
  local branches
  branches=$(git branch | fzf -m | awk '{print $1}')
  if [[ -n "${branches}" ]]; then
    branches=$(tr '\n' ' ' <<< "${branches}")
    git branch -D ${=branches}
  fi
}
  • fzf -mで複数のブランチを選択できるようにする
  • $(tr '\n' ' ' <<< "$branches")fzfの出力が改行区切りであるのを空白区切りにする
    • <<<here stringecho ${branches} | tr ...と同じことができる
  • ${=branches}zshで変数展開するときに空白で分割されるために必要
    • デフォルトではbranches="b1 b2"の場合,git branch -D ${branches}とすると"b1 b2"という空白含みの1つのブランチ名を削除しようとして失敗する
    • ${=変数名}とすることでb1b2という二つのブランチを削除するように指定できる