I recently forked a project and applied several fixes. I then created a pull request which was then accepted.
A few days later another change was made by another con
If you set your upstream. Check with git remote -v
, then this will suffice.
git fetch upstream
git checkout master
git merge --no-edit upstream/master
git push
Foreword: Your fork is the "origin" and the repository you forked from is the "upstream".
Let's assume that you cloned already your fork to your computer with a command like this:
git clone git@github.com:your_name/project_name.git
cd project_name
If that is given then you need to continue in this order:
Add the "upstream" to your cloned repository ("origin"):
git remote add upstream git@github.com:original_author/project_name.git
Fetch the commits (and branches) from the "upstream":
git fetch upstream
Switch to the "master" branch of your fork ("origin"):
git checkout master
Stash the changes of your "master" branch:
git stash
Merge the changes from the "master" branch of the "upstream" into your the "master" branch of your "origin":
git merge upstream/master
Resolve merge conflicts if any and commit your merge
git commit -am "Merged from upstream"
Push the changes to your fork
git push
Get back your stashed changes (if any)
git stash pop
You're done! Congratulations!
GitHub also provides instructions for this topic: Syncing a fork
Use these commands (in lucky case)
git remote -v
git pull
git fetch upstream
git checkout master
git merge upstream/master --no-ff
git add .
git commit -m"Sync with upstream repository."
git push -v
As a complement to this answer, I was looking for a way to update all remote branches of my cloned repo (origin) from upstream branches in one go. This is how I did it.
This assumes you have already configured an upstream remote pointing at the source repository (where origin was forked from) and have synced it with git fetch upstream
.
Then run:
for branch in $(git ls-remote --heads upstream|sed 's#^.*refs/heads/##'); do git push origin refs/remotes/upstream/$branch:refs/heads/$branch; done
The first part of this command lists all heads in the upstream remote repo and removes the SHA-1 followed by refs/heads/
branch name prefix.
Then for each of these branches, it pushes the local copy of the upstream remote tracking branch (refs/remotes/upstream/<branch>
on local side) directly to the remote branch on origin (refs/heads/<branch>
on remote side).
Any of these branch sync commands may fail for one of two reasons: either the upstream branch have been rewritten, or you have pushed commits on that branch to your fork. In the first case where you haven't committed anything to the branch on your fork it is safe to push forcefully (Add the -f switch; i.e. git push -f
in the command above). In the other case this is normal as your fork branch have diverged and you can't expect the sync command to work until your commits have been merged back into upstream.
If, like me, you never commit anything directly to master, which you should really, you can do the following.
From the local clone of your fork, create your upstream remote. You only need to do that once:
git remote add upstream https://github.com/whoever/whatever.git
Then whenever you want to catch up with the upstream repository master branch you need to:
git checkout master
git pull upstream master
Assuming you never committed anything on master yourself you should be done already. Now you can push your local master to your origin remote GitHub fork. You could also rebase your development branch on your now up-to-date local master.
Past the initial upstream setup and master checkout, all you need to do is run the following command to sync your master with upstream: git pull upstream master.
In your local clone of your forked repository, you can add the original GitHub repository as a "remote". ("Remotes" are like nicknames for the URLs of repositories - origin
is one, for example.) Then you can fetch all the branches from that upstream repository, and rebase your work to continue working on the upstream version. In terms of commands that might look like:
# Add the remote, call it "upstream":
git remote add upstream https://github.com/whoever/whatever.git
# Fetch all the branches of that remote into remote-tracking branches
git fetch upstream
# Make sure that you're on your master branch:
git checkout master
# Rewrite your main branch so that any commits of yours that
# aren't already in upstream/main are replayed on top of that
# other branch:
git rebase upstream/master
If you don't want to rewrite the history of your main branch, (for example because other people may have cloned it) then you should replace the last command with git merge upstream/main
. However, for making further pull requests that are as clean as possible, it's probably better to rebase.
If you've rebased your branch onto upstream/main
you may need to force the push in order to push it to your own forked repository on GitHub. You'd do that with:
git push -f origin master
You only need to use the -f
the first time after you've rebased.