The pullers need to be very careful though, otherwise they'll just reintroduce the commits. It's best if you have them re-clone instead. Make sure they save their old local repo though, so you don't lose any unpushed work they may have had.
–
TekkubAug 3 '11 at 19:54

I suppose your bad commit is the last on your local repo and your pirvate central repo.

To remove it (bad commit) from your history run
git reset HEAD^ --hard or git reset <sha1_of_bad_commit> --hard
after that you can push changes to your private central repo with
git push -f <remote>push -f will force git to overwrite HEAD (i.e. forget about bad commit).

You can also do the same thing with github repo.

As for other developers who already pulled bad commit you can ask them to run the same command (git reset HEAD^ --hard) if bad commit is on top of their branches or to run git rebase -i <sha1_of_bad_commit> and delete bad commit during interactive rebase.

Do not do this if you have already given these commits to somebody else

But well, you did. If you pushed your modified version to the central repo and someone that has fetched the version including the three bad commits from the central repo, the three bad commits are still present in his/her repo.

Everyone that has pulled from the repo when the three bad commits were present there will have to remove these wrong commits from his/her repo to get them clean again.

So tell them to fire up a console and use git fetch origin (to fetch the version from GitHub) git rebase -i origin/master to rebase their master branch on your forcibly pushed one and tell them the SHA-IDs of the commits they will have to delete.