Правка последнего коммита

Для правки ''последнего'' коммита достаточно выполнить git commit --amend, который перезакоммитит при выполнении ряда разумных условий добавленные после коммита изменения «заодно».

Правка коммитов в общем случае

В общем случае для редактирования коммитов удобно применять git rebase --interactive. Это выглядит примерно так:

$ git rebase -i коммит^
[ Нам показывают в редакторе список коммитов. Перед тем, который хотим исправить, меняем @pick@ на @edit@.
Сохраняем и выходим. ]
You can amend the commit now, with

       git commit --amend

Once you are satisfied with your changes, run

       git rebase --continue

[ Теперь текущим стал тот коммит, который мы хотим исправить. ]
$ vim нужный/файл  # исправляем всё, что хотим
$ git commit --am нужный/файл
$ git rebase --continue

То же самое можно сделать и вручную.

Правка коммитов вручную, без git-rebase

Иногда не хочется делать новые коммиты, которые являются мелкими исправлениями к предыдущим коммитам. Поэтому я предлагаю такое правило для использования git push --force: нельзя заменять коммиты дальше последнего публичного тэга, или же дальше коммита, отправленного на сборку (без специальных усилий изменение такого коммита приведет к тому, что следующая сборка будет отвергнута).

Допустим, что эти условия выполнены, а исправления мелких/глупых ошибок не хочется оформлять отдельно. Для примера объясню, как поправить пред-предпоследний коммит.

Сначала нужно сохранить текущую работу во временный бранч:

$ git branch save

Потом нужно откатить работу до пред-предпоследнего коммита:
$ git reset --hard HEAD^^

Теперь нужно поправить пред-предпоследний коммит, который стал текущим:
$ vim ...
$ git commit -a --am

Затем поверх пред-предпоследнего коммита нужно накатить предпоследний и
последний коммиты из сохраненного бранча:
$ git cherry-pick -r save^
$ git cherry-pick -r save

Осталось только удалить временный бранч:
$ git branch -D save

После этого уже можно сделать
$ git push --force git.alt

Спасибо!