Git reset --hard and push to remote repository
If forcing a push doesn't help (git push --force origin
or git push --force origin master
should be enough), it might mean that the remote server is refusing non fast-forward pushes, via either receive.denyNonFastForwards
config variable (see git config manpage for description), or via an update/pre-receive hook.
With older Git you can work around that restriction by deleting git push origin :master
(note the :
before branch name) and then re-creating git push origin master
given branch.
If you can't change this, then the only solution would be instead of rewriting history to create a commit reverting changes in D-E-F:
A-B-C-D-E-F-[(D-E-F)^-1] master
A-B-C-D-E-F origin/master
For users of GitHub, this worked for me:
- In any branch protection rules where you wish to make the change, make sure Allow force pushes is enabled
git reset --hard <full_hash_of_commit_to_reset_to>
git push --force
This will "correct" the branch history on your local machine and the GitHub server, but anyone who has sync'ed this branch with the server since the bad commit will have the history on their local machine. If they have permission to push to the branch directly then these commits will show right back up when they sync.
All everyone else needs to do is the git reset
command from above to "correct" the branch on their local machine. Of course they would need to be wary of any local commits made to this branch after the target hash. Cherry pick/backup and reapply those as necessary, but if you are in a protected branch then the number of people who can commit directly to it is likely limited.
To complement Jakub's answer, if you have access to the remote git server in ssh, you can go into the git remote directory and set:
user@remote$ git config receive.denyNonFastforwards false
Then go back to your local repo, try again to do your commit with --force
:
user@local$ git push origin +master:master --force
And finally revert the server's setting in the original protected state:
user@remote$ git config receive.denyNonFastforwards true