fzfを利用してgitコマンドの使い勝手を向上する
やりたいこと
頻繁に利用するgitコマンドの使い勝手を向上する.具体的には以下を達成したい.
環境
参考
- [ターミナル]fzfを使った自作インタラクティブアプリを作ってみよう!〜git addを快適に〜
- 本記事はこちらで紹介されたやり方そのまま上記を達成するために利用している
実装
ローカルブランチをブランチ一覧からインタラクティブに選択しチェックアウトする
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 stringでecho ${branches} | tr ...
と同じことができる
${=branches}
はzshで変数展開するときに空白で分割されるために必要- デフォルトでは
branches="b1 b2"
の場合,git branch -D ${branches}
とすると"b1 b2"
という空白含みの1つのブランチ名を削除しようとして失敗する ${=変数名}
とすることでb1
とb2
という二つのブランチを削除するように指定できる- こちらの記事を参考にした
- デフォルトでは