GitHub のプルリクエストを fetch しとくと便利

GitHub や GHE を使って多人数で開発していると,プルリクエストを横断して試す必要が頻繁に発生すると思います.
プルリクエストを次々に試したり,#30 と #31 をマージした結果を試したい!なんてケースもあるのではないでしょうか.

GitHub では git ls-remote すれば分かるように,プルリクエストの番号と対応したブランチがリモートに存在しているので,これを取得してみます.

.git/config に追記(あるいは git remote add とかで適当に)

[remote "pr"]
    url = git@github.com:yourusername/yourrepos.git
    fetch = +refs/pull/*:refs/remotes/pr/*

あるいはこんな感じ(丸投げ): https://gist.github.com/3342247

git fetch で取得します.

$ git fetch pr
...
 * [new ref]         refs/pull/1/head -> pr/1/head
 * [new ref]         refs/pull/1/merge -> pr/1/merge
 * [new ref]         refs/pull/10/head -> pr/10/head
 * [new ref]         refs/pull/10/merge -> pr/10/merge
 * [new ref]         refs/pull/100/head -> pr/100/head
 * [new ref]         refs/pull/100/merge -> pr/100/merge
 * [new ref]         refs/pull/101/head -> pr/101/head
...

さてこれができるようになると,こんなのが簡単にできます.(以下の例でローカルブランチ名など適当なので適宜好みで)

PR #30 を追いかけたい:

$ git checkout pr/30/head -b 30h
...
... #30 が更新されたら追従
$ git pull

PR #31 の GitHub による自動マージ結果を取得したい

$ git checkout pr/31/merge -b 31m

PR #32 に #33 をマージしたものを使いたい

$ git checkout pr/32/merge -b 32_33
$ git merge pr/33/head

のようにできます.一般的には「どこの(誰の)レポジトリのどのブランチ」という情報が必要なのですが,この方法なら番号だけ知っていればいい分楽に操作できるはずです.

なお,特にドキュメントに書いてある情報ではなさそうなので,上記の内容についての保証はしかねます.