Отмена и исправление ошибок
TL;DR:
amend— исправить последний коммит.reset— откатить (только локально).revert— отменить коммит новым коммитом (безопасно для shared).reflog— спасательный круг.
Исправить последний коммит
# Изменить сообщение
git commit --amend -m "feat: correct message"
# Добавить забытый файл
git add forgotten-file.py
git commit --amend --no-edit⚠️
amendпереписывает коммит. Не делать если уже запушен.
Убрать файл из staging
git restore --staged file.txt
# или (старый синтаксис)
git reset HEAD file.txtОтменить изменения в файле
# Вернуть файл к последнему коммиту
git restore file.txt
# или
git checkout -- file.txt
# ⚠️ Изменения будут ПОТЕРЯНЫ (нет undo)Reset (откатить коммиты)
# Soft: коммиты убраны, изменения остаются в staging
git reset --soft HEAD~1
# Mixed (default): коммиты убраны, изменения в working dir
git reset HEAD~1
# Hard: коммиты убраны, изменения УДАЛЕНЫ
git reset --hard HEAD~1
# ⚠️ Данные потеряны!
# Откатить к конкретному коммиту
git reset --hard abc123| Режим | Коммит | Staging | Working Dir |
|---|---|---|---|
--soft | ❌ Убран | ✅ Сохранён | ✅ Сохранён |
--mixed | ❌ Убран | ❌ Убран | ✅ Сохранён |
--hard | ❌ Убран | ❌ Убран | ❌ Убран |
Revert (безопасная отмена)
# Создаёт новый коммит, отменяющий изменения
git revert abc123
# Отменить последний коммит
git revert HEAD
# Отменить несколько коммитов
git revert HEAD~3..HEADRevert vs Reset: revert безопасен для shared веток (не переписывает историю). Reset — только для локальных.
Reflog — спасательный круг
# Показать все действия за 30 дней
git reflog
# abc123 HEAD@{0}: reset: moving to HEAD~1
# def456 HEAD@{1}: commit: feat: important feature ← вот он!
# Восстановить
git reset --hard def456
# или
git cherry-pick def456Cherry-pick (перенести коммит)
# Скопировать коммит из другой ветки
git cherry-pick abc123
# Несколько
git cherry-pick abc123 def456
# Без автокоммита (только изменения)
git cherry-pick --no-commit abc123Типичные ошибки
| Ошибка | Решение |
|---|---|
git reset --hard потерял работу | git reflog → найти SHA → git reset --hard SHA |
| Запушил секрет (пароль, ключ) | git filter-repo для удаления из истории. Сменить секрет! |
| Не тот файл в коммите | git reset --soft HEAD~1 → исправить → commit заново |
| Revert мерж-коммита | git revert -m 1 MERGE_SHA (указать parent) |