概要
GitHub上のPull Request(以下、PR)をレビューする際に、そのPRを実際に動かして挙動を確認したい場面がある。しかしながらPRのHEADが最新のmaster(=マージ先ブランチの内容)を反映しているとは限らない。つまり本来であれば動作確認のためにローカルにPRのHEADにチェックアウトして、自分でマージコミットを作る必要があるが、実はリモートがGitHubであれば既にマージ先ブランチの内容を反映したマージ済みブランチを作ってくれている。しかし通常ではそこにアクセスしないようになっているので、そこにアクセスできるようにしたい。
変更内容
Git config を変更する
.git/config
を編集し、 remote ブランチの fetch するものの中に以下の行を追加する。
.git/config
[remote "origin"]
url = git@github.com:windyakin/kosen-website-crawler.git
fetch = +refs/heads/*:refs/remotes/origin/*
+ fetch = +refs/pull/*/merge:refs/remotes/pr/*
fetch してみる
$ git fetch -p
remote: Counting objects: 4, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 4 (delta 1), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (4/4), done.
From github.com:windyakin/kosen-website-crawler
* [new ref] refs/pull/21/merge -> pr/21
* [new ref] refs/pull/22/merge -> pr/22
この際の「21」や「22」はPRの番号(ID)のこと。
以降、 git fetch
を行うと pr/[ID]
にそのPRのマージ先のブランチがマージされたコミットが取得できるようになる。
checkout してみる
$ git checkout pr/21
Note: checking out 'pr/21'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
git checkout -b <new-branch-name>
HEAD is now at e0ba4c3 Merge b826855ed0f0e16b2e432ff467372c87951d5323 into f60fff0e26671d935ed9e65e3f52a6bdd69ac1b0
HEAD を確認するとその PR の HEAD がマージ先ブランチにマージされた状態のブランチであることがわかる。
注意事項
- PRがコンフリクトすると、そのコンフリクトを起こす直前までのマージコミットしか取れない
- このままでは push はできない