Как отменить последний коммит в git, но оставить изменения?
Сделал коммит слишком рано, забыл добавить один файл. Хочу отменить последний коммит, но чтобы код никуда не делся. Гуглю «как откатить последний коммит git» и путаюсь между reset и revert.
2 ответа
Зависит от того, запушил ты уже коммит или нет.
Если коммит ещё локальный (не на GitHub) — используй мягкий reset. Он сдвигает ветку на один коммит назад, а все изменения возвращает в индекс (staged):
git reset --soft HEAD~1
Теперь файлы снова готовы к коммиту, можешь дописать что нужно и закоммитить заново. Если хочешь, чтобы изменения вернулись, но не были staged (как после простого редактирования):
git reset HEAD~1
Это то же самое, что git reset --mixed HEAD~1 (режим по умолчанию).
Если коммит ты уже запушил и над репозиторием работают другие люди — НЕ переписывай историю через reset. Вместо этого сделай новый коммит, который отменяет старый:
git revert HEAD
revert создаёт обратный коммит, история остаётся целой, и у коллег ничего не сломается при git pull.
Частая ошибка: написать git reset --hard HEAD~1 — это удалит изменения безвозвратно. --hard стирает и индекс, и рабочую папку. Если файлы важны, никогда не используй --hard, пока не уверен.
Короткое правило, чтобы не запутаться:
--soft— откатить коммит, изменения остаются в staged.- (без флага)
--mixed— откатить коммит, изменения не staged, но в файлах есть. --hard— откатить коммит и стереть изменения совсем.
Для «отменить, но сохранить» бери --soft или --mixed. HEAD~1 означает «один коммит назад от текущего».