GitHub keeps saying "This branch is X commits ahead, Y commits behind"
I have the same problem with you and just solved this problem.
To solve this:
'Reset' your local repo to the moment before the abundant commits
Create a new branch using this amended local repo
'Publish' this amended local repo to your github repo
Make the changes that you want to PR to github in the amended local repo
'Commit' this local repo
'Pull' the commit to your github repo
On your github repo new branch, submit pull request to the upstream repo
Hope this answer could help.
Before working on an issue, I first want to synchronize my fork with the 'original' repository. I go to my account fork, click on New Pull request [...]
If you want to update/syncronize github forks, you should not use a Pull Request.
Pull Requests introduce merge commits, which are the source of your error message. (Pull Requests are not fast-forward
by default). The merge commits exist in your fork, but not in the source repo.
You don't want to merge their branch with your branch... you want to update your branch to point to the same commit as their branch. You want the branches between forks to be the same.
You can do this in various ways, best explained in other answers:
- pull/push from multiple remote locations
- How do I update a GitHub forked repository?
As you guessed, these extra commits are likely the merge commits from the Pull Requests that you created.
In the future, there's a much easier way to sync your fork with the original repository. In your local repo, after the initial clone do:
git remote add upstream https://github.com/upstream/repo.git
Then, whenever you want to sync the changes from upstream, do:
git pull --rebase upstream master
git push --force-with-lease origin master
(The --rebase
and --force-with-lease
options will only be necessary if you have commits that haven't been merged into the upstream repo.)
Obligatory warning: Since a rebase rewrites history, this can be dangerous / disruptive for anyone else working on this branch. Be sure you clearly communicate what you have done with anyone you are collaborating with. Since this is a personal fork, I assume this won't be an issue for you.
Now to fix your current issue after the fact.
- Add the upstream remote as described above.
Reset your local branch to match
upstream
:git checkout master git reset --hard upstream/master
If you have created any commits in your fork, you can
cherry-pick
them onto your updated version ofmaster
. If you can't remember or need help finding them, something likegit log --oneline master origin/master
should show you any commits not in upstream.
Above I assumed that you are only using one branch, master
. If you aren't already, I highly recommend that you create a new branch for each feature / bug fix that you work on. Among other benefits, this allows you to start work on another feature / bug fix when you are still waiting for an earlier PR to be merged. If you never commit directly to master
, then you can sync without the --rebase
or --force-with-lease
:
git checkout master
git pull upstream master
git push origin master
To update a feature branch after you have updated master
, do:
git checkout myfeature
git rebase master
git push --force-with-lease origin myfeature # if you have already pushed