プルリクエストのローカルへのチェックアウトをグローバルに設定してはいけない

GitHubのプルリクエストはGitHubのヘルプカンニング・ペーパーで取り上げられているようにローカルにチェックアウトすることができる。カンニング・ペーパーではその最後でグローバルに設定すると便利と書かれているが、これを設定すると厄介なことになる。

まずoriginとしてリモート・リポジトリが追加できなくなる。~/.gitconfigremote.originセクションを作ることになるので、ローカルでこれを追加しようとすると、既にあると解されるため追加できない。

代わりにremote set-urlでリモート・リポジトリのURLを指定できるが、今度はremote.origin.fetchが適切に設定されていない状態になるので、git branch --set-upstream-to=git push -uなどがうまく動かなくなる。

他、git remoteoriginをリネームしたり削除したりしようとするとエラーを返されたり、静かに失敗し期待した結果になっていないことが多々ある。また巨大な歴史あるリポジトリをgit cloneすると大量のプルリクエストが降ってきて大変なことになったりも。百害あって十利くらい。


プルリクエストをローカルに持ってきたいことはもちろんあるので、僕は以下のようにエイリアスを使って番号指定でプルリクエストをチェックアウトできるようにしてる。

[alias]
        checkout-pull-request = !sh -c 'git fetch origin pull/$1/head:pr-$1 && git checkout pr-$1' -

Gitのエイリアスは結構前からなんでも出来るようになってるので、こんな感じに引数を参照して複数のGitサブコマンドをつなげたりも出来る。最後の-が重要。

$ git checkout-pull-request 1
From https://github.com/hail2u/example
 * [new ref]         refs/pull/1/head -> pr-1
Switched to branch 'pr-1'

でも存在をすぐ忘れるのであんまり使ってない……。hub使うのが無難そう。