GitHub keeps saying "This branch is X commits ahead, Y commits behind"
Let's say there is a GitHub repository which I want to contribute to. I fork that repository into my GitHub account and I clone the fork from my account in my PC. Fine.
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, make sure that I select mine as base and the original master as head fork, I see the differences (all the commits that people did in the original repository that are not on mine).
Then I create the pull request on my fork and I merge those changes in my fork.
I go to my local repo and do a git pull
, and I have everything synchronized. Fine.
The problem comes now, in my GitHub account now it's always saying 'This branch is X commits ahead', where 'X' is the number of times that I did the synchronize process I described above. So, every time I do a pull request into the original repository (not my fork), is showing that I'm committing my code plus X more commits, that are the merges I did on my fork to synchronize with the original repository.
Of course, I don't want to push those changes into the original repository, since they already have those changes in place, so I don't understand why GitHub keeps saying to me that I have changes to commit.
I think it's something that has to be solved on my GitHub account, because in my local repository there are no changes or issues, actually I even removed it and re-cloned again.
Do you have any ideas?
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
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.