Сделали не тот коммит, испортили файл или запутались в изменениях? Git умеет откатывать почти всё — если знать нужную команду. Разберём частые ситуации и как из них выйти без паники.
Отменить незакоммиченные изменения
Изменили файл, но ещё не коммитили и хотите вернуть как было:
git restore файл # вернуть файл к последней версии
git restore . # вернуть все изменения
Это удалит правки, которые вы не успели сохранить в коммит, поэтому применяйте осознанно.
Убрать файл из индекса (staging)
Сделали git add, но передумали включать файл в коммит:
git restore --staged файл
Изменения останутся в файле, но выйдут из подготовленных к коммиту.
git revert создаёт новый коммит, отменяющий изменения, — безопасно для общей истории. git reset переписывает историю — удобно локально, но опасно, если вы уже отправили коммиты другим.Отменить последний коммит
- Оставить изменения в файлах, но убрать коммит:
git reset --soft HEAD~1 - Убрать коммит и изменения из индекса (файлы не тронуты):
git reset HEAD~1 - Полностью откатить и коммит, и изменения:
git reset --hard HEAD~1(осторожно, правки пропадут).
Безопасная отмена в общей ветке
Если коммит уже отправлен (push) и с веткой работают другие, не переписывайте историю через reset. Используйте:
git revert HEAD
Он добавит новый коммит, отменяющий изменения, и история останется целой для всех.
Частые ошибки
- Делают
git reset --hardи теряют несохранённую работу. - Переписывают историю reset-ом в общей ветке, ломая её у коллег.
- Паникуют, хотя почти всё в Git восстановимо через
git reflog.
Что запомнить
Незакоммиченное вернёт git restore, лишний add уберёт git restore --staged. Последний коммит откатывает git reset (локально) или безопасный git revert (в общей ветке). --hard удаляет изменения безвозвратно — применяйте осторожно. Почти любую «потерю» помогает найти git reflog.
Коротко: вопросы и ответы
reset или revert? Локально — reset; если коммит уже у других — revert, чтобы не ломать историю.
Можно ли вернуть после reset --hard? Часто да, через git reflog, пока Git не удалил «мусор».
Как отменить только один файл? git restore файл для изменений или git restore --staged файл для индекса.
Полезные команды-помощники
Прежде чем что-то откатывать, посмотрите текущее состояние командой git status — она показывает изменённые и подготовленные файлы. Команда git log --oneline выводит краткую историю коммитов, чтобы понять, куда откатываться. А git reflog хранит все перемещения указателя, включая «потерянные» коммиты, — это спасательный круг, если кажется, что работа пропала после жёсткого reset.
Как отменить git add для всех файлов сразу? Команда git restore --staged . уберёт из индекса все подготовленные файлы, не трогая сами изменения.
Что делать, если запутался окончательно? Сохраните важные файлы отдельной копией и загляните в git reflog — почти любую версию можно вернуть, пока Git не удалил недостижимые коммиты.
Комментарии