I'd like to check out a previously created pull request (created via GitHub web interface). I searched and found different places where a refs/pull or refs/pull/pr
But when I add fetch = +refs/pull/*/head:refs/remotes/origin/pr/*
to the git config file and do a git fetch
What I'm doing wrong? Should GitHub create automatically the pull/xyz stuff, or do I have to configure something?
This question is related to
git
github
pull-request
git-checkout
There is an easy way for doing this using git-cli
gh pr checkout {<number> | <url> | <branch>}
Reference: https://cli.github.com/manual/gh_pr_checkout
I prefer to fetch and checkout without creating a local branch and to be in HEAD detached state. It allows me quickly to check the pull request without polluting my local machine with unnecessary local branches.
git fetch upstream pull/ID/head && git checkout FETCH_HEAD
where ID
is a pull request ID and upstream
where is original pull request has been created (it could be origin
, for example).
I hope it helps.
You can use git config
command to write a new rule to .git/config
to fetch pull requests from the repository:
$ git config --local --add remote.origin.fetch '+refs/pull/*/head:refs/remotes/origin/pr/*'
And then just:
$ git fetch origin
Fetching origin
remote: Counting objects: 4, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 4 (delta 2), reused 4 (delta 2), pack-reused 0
Unpacking objects: 100% (4/4), done.
From https://github.com/container-images/memcached
* [new ref] refs/pull/2/head -> origin/pr/2
* [new ref] refs/pull/3/head -> origin/pr/3
I accidentally ended up writing almost the same as provided by git-extras. So if you prefer a single custom command instead of installing a bunch of other extra commands, just place this git-pr
file somewhere in your $PATH
and then you can just write:
git pr 42
// or
git pr upstream 42
// or
git pr https://github.com/peerigon/phridge/pull/1
For Bitbucket, you need replace the word pull
to pull-requests
.
First, you can confirm the pull request URL style by git ls-remote origin
command.
$ git ls-remote origin |grep pull
f3f40f2ca9509368c959b0b13729dc0ae2fbf2ae refs/pull-requests/1503/from
da4666bd91eabcc6f2c214e0bbd99d543d94767e refs/pull-requests/1503/merge
...
As you can see, it is refs/pull-requests/1503/from
instead of refs/pull/1503/from
Then you can use the commands of any of the answers.
Create a local branch
git checkout -b local-branch-name
Pull the remote PR
git pull [email protected]:your-repo-ssh.git remote-branch-name
The problem with some of options above, is that if someone pushes more commits to the PR after opening the PR, they won't give you the most updated version. For me what worked best is - go to the PR, and press 'Commits', scroll to the bottom to see the most recent commit hash and then simply use git checkout, i.e.
git checkout <commit number>
in the above example
git checkout 0ba1a50
Suppose your origin and upstream info is like below
$ git remote -v
origin [email protected]:<yourname>/<repo_name>.git (fetch)
origin [email protected]:<yourname>/<repo_name>.git (push)
upstream [email protected]:<repo_owner>/<repo_name>.git (fetch)
upstream [email protected]:<repo_owner>/<repo_name>.git (push)
and your branch name is like
<repo_owner>:<BranchName>
then
git pull origin <BranchName>
shall do the job
That gist does describe what happend when you do a git fetch:
Obviously, change the github url to match your project's URL. It ends up looking like this:
[remote "origin"]
fetch = +refs/heads/*:refs/remotes/origin/*
url = [email protected]:joyent/node.git
fetch = +refs/pull/*/head:refs/remotes/origin/pr/*
Now fetch all the pull requests:
$ git fetch origin
From github.com:joyent/node
* [new ref] refs/pull/1000/head -> origin/pr/1000
* [new ref] refs/pull/1002/head -> origin/pr/1002
* [new ref] refs/pull/1004/head -> origin/pr/1004
* [new ref] refs/pull/1009/head -> origin/pr/1009
...
To check out a particular pull request:
$ git checkout pr/999
Branch pr/999 set up to track remote branch pr/999 from origin.
Switched to a new branch 'pr/999'
You have various scripts listed in issues 259 to automate that task.
The git-extras project proposes the command git-pr
(implemented in PR 262)
git-pr
(1) -- Checks out a pull request locallySYNOPSIS
git-pr <number> [<remote>]
git-pr clean
DESCRIPTION
Creates a local branch based on a GitHub pull request number, and switch to that branch afterwards.
The name of the remote to fetch from. Defaults to
origin
.EXAMPLES
This checks out the pull request
226
fromorigin
:
$ git pr 226
remote: Counting objects: 12, done.
remote: Compressing objects: 100% (9/9), done.
remote: Total 12 (delta 3), reused 9 (delta 3)
Unpacking objects: 100% (12/12), done.
From https://github.com/visionmedia/git-extras
* [new ref] refs/pull/226/head -> pr/226
Switched to branch 'pr/226'
I'm using hub, a tool from github: https://github.com/github/hub
With hub checking out a pull request locally is kinda easy:
hub checkout https://github.com/owner/repo/pull/1234
or
hub pr checkout 1234
This will fetch without you having to name a branch:
git pull origin pull/939/head
If you're following the "github fork" workflow, where you create a fork and add the remote upstream repo:
14:47 $ git remote -v
origin [email protected]:<yourname>/<repo_name>.git (fetch)
origin [email protected]:<yourname>/<repo_name>.git (push)
upstream [email protected]:<repo_owrer>/<repo_name>.git (fetch)
upstream [email protected]:<repo_owner>/<repo_name>.git (push)
to pull into your current branch your command would look like:
git pull upstream pull/<pull_request_number>/head
to pull into a new branch the code would look like:
git fetch upstream pull/<pull_request_number>/head:newbranch
Github recently released a cli utility called github-cli. After installing it, you can checkout a pull request's branch locally by using its id (ref)
e.g: gh pr checkout 2267
This works with forks as well but if you then need to push back to the fork, you'll need to add the remote repository and use traditional git push
(until this ticket gets implemented in gh utility)
Get the remote PR branch into local branch:
git fetch origin ‘remote_branch’:‘local_branch_name’
Set the upstream of local branch to remote branch.
git branch --set-upstream-to=origin/PR_Branch_Name local_branch
When you want to push the local changes to PR branch again
git push origin HEAD:remote_PR_Branch_name
Referencing Steven Penny's answer, it's best to create a test branch and test the PR. So here's what you would do.
git checkout -b test
git pull origin pull/939/head:test
Now, you can safely test the changes on this local test branch (in this case, named test) and once you're satisfied, can merge it as usual from GitHub.
Source: Stackoverflow.com