Отмена коммитов

Указатель HEAD - указатель на последний коммит текущей ветки.
Таким образом HEAD^ - это предпоследний коммит.

Чтобы отменить последний коммит, нужно reset-нуть состояние предпоследнего:

git reset --soft <penultimate-commit>  # предпоследний
# либо так
git reset --soft HEAD^
# либо так
git reset --soft HEAD~1
# либо если нужно сбросить ДВА последних коммита
git reset --soft HEAD~2

Последний коммит отменится, а изменения отправятся в индекс - может, понадобится их restore-нуть:

git restore --staged <file>
git restore <file>

Чтобы изменения не попали в индекс при отмене коммита - нужно:

git reset --mixed <commit>
#можно и без --mixed, ибо он стоит по дефолту:
git reset <commit>
# и
git restore <file>

Жесткий reset:

git reset --hard <commit>
# и файлы вернутся в исходное состояние (не надо restore-ить)

Жесткий режим удаляет коммит безвозвратно, поэтому и нужны —soft и —mixed, чтобы при надобности вернуть коммит “на свое место”. Жесткий есть смысл применять, если знаешь, что делаешь.


Исправление commit-ов

Если сделали коммит:

git add .; git commit -m 'tset chagnes'

И написали message с ошибкой - можно исправить его так:

git commit --amend -m 'test changes'

Если забыли добавить какой-то файл в коммит - нужно:

git add <file>  # Добавить этот файл в индекс
git commit --amend --no-edit  # --no-edit позволяет не редактировать сообщение коммита, а просто перекоммитнуть еще раз с добавленным (ранее забытым) файлом

git