How to keep a GitHub fork up to date without a merge commit or using CLI?

This is feasible with GitHub Desktop since version 1.0.7 considering the following:

  • If the current branch does not have any commits ahead upstream (the original repo of the fork), the new commits can be pulled without creating a new merge commit

    In GitHub Desktop:

    1. Clone your repository from File > Clone Repository

    2. Fetch origin, which will automatically fetch the upstream as well

    3. Go to Branches by clicking on where it says Current Branch

    4. Click on Choose a branch to merge into <branch> at the bottom

    5. Search for upstream/<branch>, then click Merge upstream/<branch> into <branch>

    6. Push to origin, et voilà!

  • Otherwise, ff the current branch has commits ahead of the fork, then of course one has to create a merge commit or rebase and force push. For rebasing which might be more preferable, do the following:

    1. In GItHub Desktop, go to Branch from menu, then Rebase Current Branch

    2. Search for upstream/<branch>, then click Start Rebase

    3. Solve any conflicts that have occurred from the rebase

    4. Force push to origin. You will get a warning for this for obvious reasons.

For avoiding force-pushing to your work when your current branch is both ahead and behind its upstream counterpart, either create a new merge commit or:

  • Make a new branch based with all your changes

  • If needed, reset the original branch to its original state (before it diverged from the original repo)

  • Perform the steps from the first scenario and merge your changes into your branch.

And yes, it seems that pulling via the GitHub website from the original repo without creating a pull request and merge commit is not possible at this moment.


Demo GIF for first scenario: https://imgur.com/a/8wci2yf

Some GitHub issues related to this:

  • Add an upstream to forked repositories

  • multi-remote support in Desktop


without a merge commit or using CLI?

Not directly with GitHub web UI alone, since it would involve rebasing your PR branch on top of upstream/master

So in short: no.
But in less short... maybe, if you really want to try it.

Rebasing through GitHub web UI is actually possible, since Sept. 2016, ...

  • if you are the maintainer of the original repo, wanting to integrate a PR branch
  • if none of the replayed commit introduces a conflict

https://github.blog/wp-content/uploads/2016/09/a03fa9b6-7f35-11e6-8fa0-e16b2fede8ca.gif?resize=788%2C423

(This differs from GitHub Desktop, which, since June 5th 2019 does support rebasing. But that is a frontend to Git CLI, like other tools provide. For example GitKraken and interactive rebase)

So a convoluted workaround would be:

  • to fetch, then push upstream/master to the master branch of your own fork (a CLI operation, but more on that below)
  • change the base branch of your current PR to master (so a PR within the same repository: your own fork), provided you haven't pushed to master.
    Meaning: master in your fork represents the updated upstream/master, with upstream being the original repository that you have forked.
  • Since you are the owner of that repository (your fork), GitHub can then show you if you can rebase said branch to the base branch of the PR (master), but only if there is no conflict.
  • finally, change the base branch again, to <originalRepo>/master (which is the intended target of your PR)

The very first step is typically done through command line, but... there might be a trick to do it (update upstream master in your fork) through web UI: see "Quick Tip: Sync a Fork with the Original via GitHub’s Web UI" by Bruno Skvorc

In short, it involves:

  • creating a new branch from your current master (which would be at upstream/master at the time you forked the original repository)

https://help.github.com/assets/images/help/branch/branch-creation-text-box.png

  • Making a PR with that new branch and <originalRepo/master>
  • doing a base switch before creating the PR

https://dab1nmslvvntp.cloudfront.net/wp-content/uploads/2016/02/1454845571Screenshot-2016-02-07-12.41.28-1024x411.png

https://dab1nmslvvntp.cloudfront.net/wp-content/uploads/2016/02/1454964017Screenshot-2016-02-07-12.41.42.png

That is the step which artificially forces upstream/master to be refreshed

You can the create and merge it with the “Merge Pull Request” button (and “Confirm Merge” afterwards): the merge will be trivial: no merge commit.

The end result is: your own master branch (in your fork) updated with upstream/master (the master branch of the original repository)!

You can then resume the steps I describe above, and change the base of your current PR to your own (now refreshed) master branch, and see if you can rebase it!