When I’ve worked a bit with my source code, I did my usual thing commit and then I pushed to a remote repository. But then I noticed I forgot to organize my imports in the source code. So I do the amend command to replace the previous commit:
> git commit --amend
Unfortunately the commit can’t be pushed back to the repository. It is rejected like this:
> git push origin
To //my.remote.repo.com/stuff.git/
! [rejected] master -> master (non-fast forward)
error: failed to push some refs to '//my.remote.repo.com/stuff.git/'
What should I do? (I can access the remote repository.)
18 s
I actually once pushed with --force
and .git
repository and got scolded by Linus BIG TIME. In general this will create a lot of problems for other people. A simple answer is “Don’t do it”.
I see others gave the recipe for doing so anyway, so I won’t repeat them here. But here is a tip to recover from the situation after you have pushed out the amended commit with –force (or +master).
- Use
git reflog
to find the old commit that you amended (call itold
, and we’ll call the new commit you created by amendingnew
). - Create a merge between
old
andnew
, recording the tree ofnew
, likegit checkout new && git merge -s ours old
. - Merge that to your master with
git merge master
- Update your master with the result with
git push . HEAD:master
- Push the result out.
Then people who were unfortunate enough to have based their work on the commit you obliterated by amending and forcing a push will see the resulting merge will see that you favor new
over old
. Their later merges will not see the conflicts between old
and new
that resulted from your amending, so they do not have to suffer.