ローカルの変更取り消し
$ git checkout .
変更はこれで全部ないことにしてくれるが、
新規追加したファイルに関しては削除されないので
完全に元に戻したいのなら別途削除する必要がある
$ git clean -df .
addを取り消し
$ git reset HEAD .
これだけだとaddの状態しか取り消されないので、
変更も取り消したいのであれば、
ローカルの変更取り消し作業も行う必要がある
commitを取り消し
$ git reset [<mode>] [<commit>] .
modeのデフォルトは--mixedであるため
変更したファイルはすべてそのままでgitの履歴が変わるだけ。
変更したファイルも含めてすべて指定のcommit状態に
戻したいのであれば、modeに--hardを指定する
また、こちらも--hardを指定したとしても新規追加のファイルは
残ったままになっているので、
完全に元に戻したいのであれば別途削除する必要がある
pushを取り消し
$ git revert [<commit>]
$ git push
こちらはどちらかというとundoするという感じではなく
指定commitまでの変更を相殺するcommitを作成するというもの
なのでrevert後にpushすることで
リモートが実質undoをしたような状態になる
ちなみに...
複数コミットを取り消したい時は
-nオプションを指定することでできる
$ git revert -n [<commit>]
$ git revert -n [<commit>]
...
$ git commit
$ git push
-nは--no-commitと同じオプションで
その名の通り、自動でコミットをしないようにする