Using Git refs to check out GitHub Pull Requests, from your local repo
When reviewing a Pull Request, it can be often more helpful to check out the codebase with the changes applied, rather than just reviewing through the interface.
However, that'd require you to
git clone the fork, and check out their branch, right?
Not quite! GitHub actually provides a Git ref that allows you to check out the Pull Request from within the local repo!
And in action:
$ git fetch $ git show-ref 50dddc24b38e0a888a04d28c5d1c55985c0f7f03 refs/heads/master b4becfa3170689061cf2108e883c17a3dfe25f33 refs/remotes/origin/MajesticMoose 3ee78704e1b80425f57f4bfb3dcd24179212c761 refs/remotes/origin/MajesticMoose-old 2bccf367f64d9896935f65933afb122432b8310e refs/remotes/origin/TC-Backup 8285b3ab1b77c10a84fdd989466802f2baa92e39 refs/remotes/origin/TheColonel 26230b87c2fa5b1d95ba0be37d80c50db66ee454 refs/remotes/origin/TheColonel-old cd69cef59834a50a6e76c04b58f0466e0d6dfc5d refs/remotes/origin/master f35e7b35cf8af7530b6be008332e1a6af00935c3 refs/remotes/origin/master-old 814696bae8c831ca661dd5e1c55adf000ac20831 refs/remotes/origin/pull/44/head a81439de6fdbe568b52df7ed7cd306d581c251a8 refs/remotes/origin/pull/44/merge 55f97d19168157a3e6ec5cfbb28b3ca2deadf827 refs/remotes/origin/pull/45/head 9076ca95e22e9d58ecd6d836b058cd2e64807507 refs/remotes/origin/pull/45/merge df945f0020bfcabee804b60d1143062bd24226af refs/remotes/origin/rewrite 814696bae8c831ca661dd5e1c55adf000ac20831 refs/remotes/origin/ssh-config 55f97d19168157a3e6ec5cfbb28b3ca2deadf827 refs/remotes/origin/update-readme 91e4d69a7c2ac7c8ad5206615114a2f78f27ad94 refs/stash $ git log -1 origin/pull/45/head commit 55f97d19168157a3e6ec5cfbb28b3ca2deadf827 (origin/update-readme, origin/pull/45/head) Author: Jamie Tanna <email@example.com> Date: Sat Dec 24 19:34:47 2016 +0000 WIP add placeholder file $ git log -1 origin/pull/45/merge commit 9076ca95e22e9d58ecd6d836b058cd2e64807507 (origin/pull/45/head) Merge: e57f7e1 55f97d1 Author: Jamie Tanna <firstname.lastname@example.org> Date: Sat Oct 21 22:01:36 2017 +0000 Merge 55f97d19168157a3e6ec5cfbb28b3ca2deadf827 into e57f7e1c7782a9966fbda16ded7fb97954921fdf
Notice that GitHub exposes two refs, unlike GitLab - one to show the original commit that has been raised, and one with it merged into the destination branch.
Note: this is documented in GitLab's Merge Requests documentation.
Configuring per-repo using
If you want only the current repo you're in to attempt to pick up Pull Requests, you can run the following in the repo:
git config remote.origin.fetch '+refs/pull/*:refs/remotes/origin/pull/*'
Configuring globally using
git config --global
If you want any repo you use to attempt to attempt to pick up Pull Requests, you can run the following in the repo:
git config --global remote.origin.fetch '+refs/pull/*:refs/remotes/origin/pull/*'
Configuring globally using
The way that I've got this set up in my personal configuration is that for each repo I have, it will try and pull down any Pull Requests for the
[remote "origin"] fetch = +refs/pull/*:refs/remotes/origin/pull/*