Forking and syncing branches with git and Github

NOTE: This post originally appeared on my (very) old Wordpress blog, and never got migrated to either my Jekyll or Hugo sites. This is just a re-posting to keep it together with other useful things.


When forking a branch on github, it was not entirely clear to me how to sync branches other than master (e.g. to make a pull request). The following eventually seemed to work:

Set upstream remotes

First, you need to make sure that your fork is set up to track the original repo as upstream (from here):

List the current remotes:

$ git remote -v
# origin (fetch)
# origin (push)

Specify a new remote upstream repository that will be synced with the fork.

$ git remote add upstream

Verify the new upstream repository you’ve specified for your fork.

$ git remote -v
# origin (fetch)
# origin (push)
# upstream (fetch)
# upstream (push)

Syncing a fork

Now you’re ready to sync changes! See here for more details on syncing a “main” branch:

Fetch the branches:

$ git fetch upstream
# remote: Counting objects: 75, done.
# remote: Compressing objects: 100% (53/53), done.
# remote: Total 62 (delta 27), reused 44 (delta 9)
# Unpacking objects: 100% (62/62), done.
# From
#  * [new branch]      master     -> upstream/master

Check out your fork’s local master branch.

$ git checkout master
# Switched to branch 'master'

Merge the changes from upstream/master into your local master branch. This brings your fork’s master branch into sync with the upstream repository, without losing your local changes.

$ git merge upstream/master
# Updating a422352..5fdff0f
# Fast-forward
#  README                    |    9 -------
#                 |    7 ++++++
#  2 files changed, 7 insertions(+), 9 deletions(-)
#  delete mode 100644 README
#  create mode 100644

Syncing an upstream branch

To sync upstream changes from a different branch, do the following:

git fetch upstream                            ;make sure you have all the upstream changes
git checkout --no-track upstream/newbranch    ;grab the new branch but don't track it
git branch --set-upstream-to=origin/newbranch ;set the upstream repository to your origin
git push                                      ;push your new branch up to origin

Related Articles