DEV Community

Serhat Teker
Serhat Teker

Posted on • Originally published at tech.serhatteker.com on

Merge Upstream Pull Request into Your Fork

Use Case

I have forked a repo, I've made some changes and my fork and upstream diverged.

In the meantime someone sent a PR to upstream and this PR is still open or rejected/closed etc by maintainers. However I'd like to apply the changes that PR proposes into my fork.

Solutions

One Time

If this is a one time thing, then you can get with fetch:

$ git fetch upstream pull/42/head
Enter fullscreen mode Exit fullscreen mode

Then you can merge, cherry-pick etc. these PR changes.

Or you can pull directly:

$ git pull upstream pull/42/head
Enter fullscreen mode Exit fullscreen mode

INFO

As you may see, above scripts assumes your remote upstream repo named upstream and 42 is the PR number you'd like to apply, change them accordingly.

Git Alias

If you regularly will apply PR*s then you can add related functions as *aliases in your local or global config, a.k.a one of the below:

  • ${YOUR_REPO}/.git/config (local)
  • ~/.gitconfig (global)
  • ${XDG_CONFIG_HOME}/git/config (global)
# ${REPO}/.git/config
# ~/.gitconfig
# ${XDG_CONFIG_HOME}/git/config
[alias]
    gfpr = "!f() { git fetch upstream refs/pull/$1/head:pr/$1; } ; f"
    gppr = "!f() { git pull upstream pull/$1/head; } ; f"
Enter fullscreen mode Exit fullscreen mode

Then fetch all *PR*s.

$ git fetch upstream
Enter fullscreen mode Exit fullscreen mode

To check out a particular PR #42:

$ git checkout pr/42
Branch pr/42 set up to track remote branch pr/42 from upstream.
Switched to a new branch 'pr/42'
Enter fullscreen mode Exit fullscreen mode

Local gitconfig

You can append fetch config in your local config.

# .git/config
[remote "upstream"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = git@github.com:joyent/node.git
    fetch = +refs/pull/*/head:refs/remotes/origin/pr/*
Enter fullscreen mode Exit fullscreen mode

The rest is the same as above.

With Script

You can append above related fetch config with below script:

#!/usr/bin/env bash
#
# git-fetch-pr.sh

git remote -v | grep fetch | grep github | \
    while read remote url _; do
        if ! git config --get-all "remote.$remote.fetch" | grep -q refs/pull
        then
            git config --add "remote.$remote.fetch" \
                '+refs/pull/*/head:refs/remotes/'"$remote"'/pull/*'
        fi
    done
Enter fullscreen mode Exit fullscreen mode

The rest is the same.

All done!

Resources:

Latest comments (0)