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

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使うのが無難そう。