Create: Update:
простымисловами: Как «откатить» последний коммит в Git
❗️ Важно. Прежде чем что-то отменять, убедитесь, что понимаете, нужно ли изменять историю и синхронизирован ли ваш коммит с удалённым репозиторием (GitHub, GitLab и т. д.). Для приватных веток это обычно безопасно, но в общей ветке лучше быть осторожным.
Существует несколько способов сделать это. Давайте рассмотрим каждый из них:
1. Вернуть изменения в рабочие файлы, но убрать коммит из истории
Если вы хотите переделать сообщение или добавить файлы, используйте
git reset --soft HEAD~1
. Он убирает «снимок» последнего коммита, но все ваши изменения остаются в индексе (staging). Дальше можно поправить файлы, написать новое сообщение и закоммитить снова.2. Убрать коммит из истории, но оставить изменения «распакованными» (не в индексе)
Если нужно сначала ещё раз глянуть на файлы, а потом решать, что с ними делать:
git reset --mixed HEAD~1
или просто git reset HEAD~1
. Он удаляет последний коммит, а файлы раскладывает в рабочую директорию. Индекс очищен — придётся снова добавлять нужные файлы через git add
.3. Полностью стереть и коммит, и изменения
Если коммит «не тот» и вам не нужны даже изменения:
git reset --hard HEAD~1
. Он возвращает ветку и рабочую директорию к состоянию до коммита. Восстановить потом будет непросто, поэтому используйте осторожно.Коммит уже ушёл на сервер (GitHub, GitLab):
а) Историю изменять нельзя (например, в общей ветке)
Используйте «отменяющий» коммит:
git revert HEAD
. Git создаст новый коммит, который инвертирует изменения последнего. История остаётся линейной, а коллегам не нужно ничего форс-пушить.б) Историю нужно перезаписать и вы уверены, что можно force-push
git reset --hard HEAD~1
git push --force # или --force-with-lease, чтобы не затереть чужие коммиты
Такой подход стирает коммит на сервере. Договоритесь с командой, чтобы никто не успел на основе старой истории создать новые коммиты.
Чтобы точно избежать проблем, воспользуйтесь этим коротким чек-листом перед «откатом»:
1. Проверьте, пушили ли вы коммит.
2. Выберите подходящее действие:
—
reset --soft
— оставить всё в индексе;—
reset --mixed
— убрать из индекса, но сохранить файлы;—
reset --hard
— удалить всё;—
revert
— отменить «по-честному», если история уже общая.3. При force-push предупредите коллег!
#git