Skip to content

Instantly share code, notes, and snippets.

@CristinaSolana
Created February 22, 2012 14:56
Show Gist options
  • Save CristinaSolana/1885435 to your computer and use it in GitHub Desktop.
Save CristinaSolana/1885435 to your computer and use it in GitHub Desktop.
Keeping a fork up to date

1. Clone your fork:

git clone [email protected]:YOUR-USERNAME/YOUR-FORKED-REPO.git

2. Add remote from original repository in your forked repository:

cd into/cloned/fork-repo
git remote add upstream git://github.com/ORIGINAL-DEV-USERNAME/REPO-YOU-FORKED-FROM.git
git fetch upstream

3. Updating your fork from original repo to keep up with their changes:

git pull upstream master
@brandnewx
Copy link

8 years on and still the most useful post on Github.

@CristinaSolana
Copy link
Author

Glad it helped @lightkun10 @Chadori @sarahqiao9 @brandnewx

@sourabhdeshmukh
Copy link

Thanks it Worked for me. :)

@trillaxe
Copy link

thank you!

@CompassTheSolution
Copy link

@RatnadeepBiswakarma
git rebase upstream master

should be:

git rebase upstream/master

And it worked great for me, thanks!

@luisriverag
Copy link

I built a web based solution to sync the fork with the original using only GitHub APIs. It's all web, you don't need to do anything on the client
https://forkrefresh.herokuapp.com
As a plus it tells you the status off all your repos as compared to sources of the forks.

Thanks, worked really well on 289 forks I hadn't updated in a looooong time!!!

@pramodjodhani
Copy link

Thanks a lot 👍

@RodolfoGS
Copy link

Thanks!

@kxrob
Copy link

kxrob commented Aug 4, 2020

github should add a button / function for doing this frequently needed (fast-forward) re-sync from upstream without needing that triangle process via local repo + commandline. The local repos could cleanly track one remote.

If one does the sync via github pull-request + "switching the base" + normal Merge, a extra merge commit is inserted (because github internally uses merge --no-ff). Via "Rebase and merge" option of the merge button it doesn't create clean history either, rather produces an extended mess ("branch is N commits ahead + N commits behind ..." !) - probably because a 'commited by info' or so is added to the meta data of the commits.

@DahnJ
Copy link

DahnJ commented Aug 9, 2020

Thanks for this!

@ValentineDragan
Copy link

The only fix that worked for me, thank you! :)

@CristinaSolana
Copy link
Author

Glad you all are finding this helpful. :)

@zcmgyu
Copy link

zcmgyu commented Oct 13, 2020

Update Oct 13, 2020:

git pull upstream main

@swathi-vennela
Copy link

fatal: Couldn't find remote ref master

after running
git pull upstream master

@mikemartino
Copy link

Thank you.

@jasontwuk
Copy link

Thanks. This Helps me a lot. 🙂

@laoshaw
Copy link

laoshaw commented Dec 10, 2020

These comments all seem to depend on cloning the repo to your local computer and doing the fetch and merge there followed by a push. You can perform the sync to the upstream repo directly on github. Generate a pull request at the upstream repo (there is a link "compare forks") specifying your fork as the base and the upstream branch you want to merge as the head. Generate the pull request and if all goes well, you can accept your PR and you do not have to fetch both to your local site. The merge is done directly on github.

Thanks. Saved my day.

@nakul-shahdadpuri
Copy link

Thanks, helped a lot.

@Praful932
Copy link

I built a web based solution to sync the fork with the original using only GitHub APIs. It's all web, you don't need to do anything on the client
https://forkrefresh.herokuapp.com
As a plus it tells you the status off all your repos as compared to sources of the forks.

This helps! Thank you

@sami2020pro
Copy link

Thank you ❤️

@vivian-duong
Copy link

git pull is a git fetch and git merge in one step.
So the git fetch in step 2 is redundant if you're going to do a git pull anyway.

I second this. git fetch and then git pull won't break anything, but it's redundant.

@maryamrmz
Copy link

You can update it to:

git pull upstream main

@rebase-upstream
Copy link

This post should have been the first Google result. Would have saved me some time.

@emrecoban
Copy link

You can update it to:

git pull upstream main

thank you @maryamrmz it worked for me!

@mwaeckerlin
Copy link

How to keep a full project in sync, all the branches from the server and automated (no local checkout)?

I just want a slave mirror.

@mathieucarbou
Copy link

mathieucarbou commented Apr 29, 2021

Found an automatic and flexible solution using Github Actions that can be easily applied quickly to any fork.
See my blog post: https://blog.mathieu.photography/post/649318432483033088/automatic-fork-syncing-with-github
Or Gist: https://gist.github.com/mathieucarbou/96ab30024f0d3fb44cac970219d23efc

@liosc
Copy link

liosc commented Mar 19, 2022

Hi everyone.
I tried the commands suggested in this post. I was able to add the remote but when I try to pull for updating local I get the error "The unauthenticated git protocol on port 9418 is no longer supported.". I solved it using http// instead of git// when adding the upstream.

@uzluisf
Copy link

uzluisf commented Apr 7, 2024

I find it funny that years after years I keep coming back to this gist.

@jef
Copy link

jef commented Apr 8, 2024

I find it funny that years after years I keep coming back to this gist.

Based on this awesome gist, I made a little bash function for myself and use it on a few machines so I don't have to remember 😅

@pa-0
Copy link

pa-0 commented Jun 2, 2024

Just FYI, here's a method for anyone who wants to sync their GitHub forks with upstream without having to create a local clone:

The official GitHub CLI now supports syncing forks remotely with this simple command... (From GitHub's official docs:) "To update the remote fork from its parent, use the gh repo sync -b BRANCH-NAME subcommand and supply your fork and branch name as arguments.

gh repo sync owner/cli-fork -b BRANCH-NAME

If the changes from the upstream repository cause conflict then the GitHub CLI can't sync. You can set the --force flag to overwrite the destination branch."

Note

It is also possible to simplify the command by only supplying your fork (in the username/repo name syntax), like so:

gh repo sync OWNER/REPO

GitHub CLI will attempt to match your default/main/master branch with that of the parent and sync the two -- assuming there are no merge conflicts. Otherwise, it will notify of such.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment