82

I'm not really familiar with how git works. I pushed a commit by mistake and want to revert it. I did a

git reset --hard HEAD~1

Beware Fellow Googlers: This does not only revert the commit, but discards all file changes!

and now the project is reverted on my machine, but not on github. If I try to push this code, I get the error 'Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded.' How do I remove this commit from github?

seb
  • 4,279
  • 2
  • 25
  • 36
David Mulder
  • 7,595
  • 11
  • 45
  • 61

5 Answers5

76

This article has an excellent explanation as to how to go about various scenarios (where a commit has been done as well as the push OR just a commit, before the push):

From the article, the easiest command I saw to revert a previous commit by its commit id, was:

git revert dd61ab32
nmichaels
  • 49,466
  • 12
  • 107
  • 135
AmpT
  • 2,146
  • 1
  • 24
  • 25
44

You can do git push --force but be aware that you are rewriting history and anyone using the repo will have issue with this.

If you want to prevent this problem, don't use reset, but instead use git revert

Šimon Tóth
  • 35,456
  • 20
  • 106
  • 151
  • 5
    Generally, I say rewriting history is not a good idea, but particularly in a shared environment. Go with the `git revert` – trimbletodd May 22 '12 at 20:38
  • 5
    NOTE: `git revert ` deletes newly added files from disk. luckily I had them open in vscode and did cmd+s – valem Nov 21 '18 at 06:50
19

Or you can try using git revert http://www.kernel.org/pub/software/scm/git/docs/git-revert.html. I think something like git revert HEAD~1 -m 1 will revert your last commit (if it's still the last commit).

Luke
  • 3,742
  • 4
  • 31
  • 50
13

Unable to comment on others answers, I'll provide a bit of extra information.

If you want to revert the last commit, you can use git revert head. head refers to the most recent commit in your branch.

The reason you use head~1 when using reset is that you are telling Git to "remove all changes in the commits after" (reset --hard) "the commit one before head" (head~1).

reset is to a commit, revert is on a commit.

As AmpT pointed out, you can also use the commit SHA to identify it, rather than counting how far away from head it is. The SHA can be found in the logs (git log) and a variety of other ways.

You can also always use any other pointers in Git. e.g. a tag or branch. And can also use all of these fun other ways to reference commits https://www.kernel.org/pub/software/scm/git/docs/git-rev-parse.html#_specifying_revisions

Rodel30
  • 181
  • 1
  • 3
  • "reset is to a commit, revert is on a commit." <= thanks for that sentence, the light bulb just went on – brichins Jun 08 '18 at 14:58
2

I think you need to push a revert commit. So pull from github again, including the commit you want to revert, then use git revert and push the result.

If you don't care about other people's clones of your github repository being broken, you can also delete and recreate the master branch on github after your reset: git push origin :master.

Ilkka
  • 2,644
  • 1
  • 23
  • 27