How can I fetch an unmerged pull request for a branch I don't own?

后端 未结 13 1468
北荒
北荒 2020-11-27 10:55

I need to pull in a specific pull request (that hasn\'t been processed into the main stream yet) in the NServiceBus repo:

https://github.com/johnsimons/NServiceBus/c

相关标签:
13条回答
  • 2020-11-27 11:24

    For difficult situations (especially if you have not a checked out git-repo), I think the simplest way is to apply a patch. For this just open the pull-request on github and add a ".patch" to the URL, download it and apply the patch.

    Example:

    cd cordova-plugin-media
    wget https://github.com/apache/cordova-plugin-media/pull/120.patch
    patch -p1 < 120.patch
    
    0 讨论(0)
  • 2020-11-27 11:27

    github/hub

    https://github.com/github/hub is a GitHub CLI helper that deals with this and other use cases beautifully using extra information from the GitHub API. E.g.:

    git clone https://github.com/github/hub
    # Just copy paste the URL.
    hub checkout https://github.com/github/hub/pull/970
    

    Result:

    • we are now on a branch called <USERID>-<BRANCH_NAME> that contains the PR.

      Note the good branch name which was automatically set for us.

    • that branch is set to track the original branch on the fork, i.e. .git/config contains:

      [branch "<USERID>-<BRANCH_NAME>"]
          remote = retronym
          merge = refs/heads/ticket/969
          rebase = true
      

      So if further commits get pushed, we can git fetch them directly.

    Installing hub on Linux is currently a pain if you're not familiar with Go, but worth it. On Ubuntu 14.04, the Go on the repositories is too old, so GVM is the best option:

    bash < <(curl -LSs 'https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer')
    . "$HOME/.gvm/scripts/gvm"
    gvm install 'go1.4'
    gvm use 'go1.4' --default
    go get github.com/github/hub
    

    I have also asked GitHub to give us a copy paste cheatsheet on the web UI at: https://github.com/isaacs/github/issues/449

    0 讨论(0)
  • 2020-11-27 11:30

    If you just want to add one unmerged Pull Request from some other repo, to your own, there is no need for all complications (as mostly shown in other answers).

    Instead just go into your own repo and pull in the commit (from PR source), using its commit hash.

    git pull https://bitbucket.org/SomeUser/SomeProjectRepo/commits/c15...db2
    

    Doing it this way, you will just have a bunch of new edited files, as if you had edited them yourself. It's then up to you if you want to commit these with some tag/label.

    If you then want to push all news up to your own GitHub repo, just do as always:

    git commit -m "Added something by Anonymous"
    git push -u origin master
    
    0 讨论(0)
  • 2020-11-27 11:31

    Once you added the upstream repo as an upstream remote (as @elias pointed out):

    $ git remote add upstream git@github.com:Particular/NServiceBus
    

    You can configure git to fetch pull requests by default:

    $ git config --local --add remote.upstream.fetch '+refs/pull/*/head:refs/remotes/upstream/pr/*'
    

    So, let's fetch it:

    $ git fetch upstream
    Fetching upstream
    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/Particular/NServiceBus
     * [new ref]         refs/pull/1/head -> upstream/pr/1
     * [new ref]         refs/pull/2/head -> upstream/pr/2
    

    And check it out:

    $ git checkout pr/2
    Branch pr/2 set up to track remote branch pr/2 from upstream.
    Switched to a new branch 'pr/2'
    
    0 讨论(0)
  • 2020-11-27 11:31

    Here're the commands that worked for me.

    I'll assume that one has already cloned a repo (for e.g. pytorch ) to his/her system locally. After that some volunteer/enthusiast has contributed some code and issued a PR to the remote repository but it has not been merged into the master or any other branch yet. So,

    First we'll have to do git remote add to the github remote repository:

    # I've given the name `original`; you can give some other name as per your liking
    $ git remote add original https://github.com/pytorch/pytorch
    

    Then cd into the repository pytorch and then simply do:

    # after this, the unmerged PR should be pulled to your local repo
    $ git fetch original pull/<pull_number>/head    # 23, 123 etc.,
    

    Now, the pending PR has been fetched into your local repo and the tip of your fetch would be in FETCH_HEAD. If you want to merge this pending PR locally, then simply do:

    $ git merge FETCH_HEAD
    

    After this, if you do:

    $ git status
    

    You should be able to see that the local repo is ahead of n commits that were part of the pending PR (i.e. it's possible to issue more than 1 commit in a single PR). So, the number of commits depend on the commits contained in the pending PR.

    0 讨论(0)
  • 2020-11-27 11:31

    Github has clear doc for merging the pull request into a local repo:

    https://help.github.com/en/articles/checking-out-pull-requests-locally

    It boils down to knowing that a pull request in GitHub is just a branch in the base repo where the branch name is a sequence number. The above article shows you how to find this number and the git command line magic to pull it into your local repo with whatever branch name you'd like.

    I could not find a similarly simple way to merge the pull request into a fork I created on GitHub.

    0 讨论(0)
提交回复
热议问题