Отмена коммитов
Указатель
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 позволяет не редактировать сообщение коммита, а просто перекоммитнуть еще раз с добавленным (ранее забытым) файлом