[Git] GitHubのPullRequestされているブランチをpecoでサッとチェックアウトする


GitHubのPullRequestされているブランチをpecoでチェックアウトする

普段業務でGitHubを使っており、PullReqestからのレビュー、マージなどを行っています。
僕はレビューはGitHub上で差分だけ見るのではなくて、ローカルに対象ブランチをcheckoutして実際に動かしながらレビューするときが多いので、

git fetch
git checkout -b pr-branch-name origin/pr-branch-name

としてレビューを始めることが度々ありました。
・・・が、今日、ふと、こんだけ毎日レビューしてるのに、毎回これやるのめんどいよな、と思いちょっと調べてみました。

道具

  • hub
    GitHubが作ってるらしい、git コマンドをラップしてさらにGitHub特有の処理とかを便利にできるコマンドを追加したツールです。

  • peco
    みんな大好きpecoです。hubのコマンドを使ってcheckout対象ブランチを選びます。

実装

hubのサブコマンドで pr というGitHubのプルリクエスト関連の内容を取得するコマンドがあり、このサブコマンドで

  • list
    いろんな条件で、カレントディレクトリのプロジェクトが対応するGitHubのリポジトリのPRを取得する

  • checkout
    PullRequestの番号( #11 とかの番号)をキーにローカルに対象ブランチをcheckoutする。
    すでにcheckoutしたブランチが合った場合は、git pullして最新にする

というのがあり、これらを使って hub pr list の結果を適当にフィルタ、加工して、pecoで、PullReqest番号を選択し hub pr checkout でcheckoutします。

zsh/bashで動く関数として実装しています。 .zshrc, .bashrc 等に追加して、 sourceします。
ghprというコマンドとして動くようにしています。

# pecoでいまopenされているprのブランチをチェックアウトする
function peco-checkout-github-pr() {
  local selected_buffer=$(hub pr list -s open -L 20 --format='%t :%H :%I%n' | peco --prompt 'pull requests>')
  if [ -n "$selected_buffer" ]; then
    local pr_no=$(echo $selected_buffer | awk -F":" '{print $NF}')
    hub pr checkout $pr_no
  fi
}
alias ghpr='peco-checkout-github-pr'

こんな感じのPullReqestのリストが合った場合に、

で選択すると、

と、無事チェックアウトされました。便利。