По книге Git Community Book.

Исправление НЕзакоммиченных ошибок

Если у вас беспорядок в working tree, но вы еще не сделали коммит, вы можете вернуть всё working tree к состоянию после последнего коммита

  $ git reset —hard HEAD

Если надо восстановить отдельный файл, например »hello.rb», юзайте

  $ git checkout — hello.rb

  $ git checkout HEAD hello.rb

Первая команда восстановит »hello.rb» до версии в индексе, так что »git diff hello.rb» не покажет различий.

Вторая команда восстановит »hello.rb» до версии из »HEAD» ревизии, так что обе команды »git diff hello.rb» и »git diff —cached hello.rb» не покажут различий.

Исправление закоммиченых ошибок

Если вы уже сделали коммит с ошибкой, есть два разных способа пофиксить проблему:

  • вы создаете новый коммит который отменяет любой старый коммит. Это если ошибка уже опубликована.
  • возвратиться назад и изменить старый коммит. Никогда не юзайте этот способ, если история уже опубликована. Git по дефолту не ожидает, что история изменится и не сможет коректно слить ветки, если история изменена.

Новый коммит

Создать новый коммит, который возвратит в старое состояние, очень просто. Укажите »git revert» на плохой коммит. Например, последний коммит:

  $ git revert HEAD

или более старый

  $ git revert HEAD^

Теперь вы можете изменить commit message для нового коммита.

Исправление коммита

Для последнего коммита

  git commit —amend

Для более позднего комита, но не опубликованного, юзайте

  git rebase -i

в интерактивном режиме. Это разрешит amend коммита в процессе rebasing.