git reset --hard
Тема дорожной карты · Изучи Git
git reset --hard <commit> — это команда, которая переводит HEAD, индекс и рабочую директорию на указанный коммит <commit>. Все незафиксированные изменения стираются, что делает эту команду мощной, но также и опасной. Она используется, когда вы осознанно хотите выкинуть все изменения с момента известного хорошего коммита. Это самый быстрый способ выбросить локальную работу, но самый лёгкий — её потерять. Восстановление возможно только через git reflog (по умолчанию хранит позиции HEAD ~90 дней), поэтому при ошибке немедленно загляните в git reflog. Никогда не делайте --hard на ветке с общей историей без согласования с командой.
Как это работает
Команда git reset --hard полностью обновляет состояние рабочего каталога, индекса и HEAD до состояния, соответствующего указанному коммиту. Например, команда git reset --hard HEAD@{1} отменяет последнее действие (любое — reflog записывает всё). Команда git reflog показывает историю движений HEAD с метками времени. Все изменения, которые когда-либо были коммитами, восстановимы в течение ~30 дней. Команда git reset --hard origin/main выравнивает локальную ветку под remote (отбрасывая локальные коммиты). Команда git fsck --dangling выводит список unreferenced коммитов.
Когда применять
Reflog служит вашей подстраховкой; даже "деструктивные" операции, такие как git reset --hard, восстановимы в течение 30 дней. Тренируйтесь думать "перед запуском, сохранит ли reflog?". Для веток с общей историей лучше использовать команду git revert, которая создает новый коммит для отмены изменений, чем git reset --hard, которая удаляет коммиты. Команда git fsck используется для восстановления коммитов, которые уже были удалены (GC может запуститься в любой момент).
Типичные ошибки
Одной из ловушек при использовании git reset --hard является попытка "освободить место" с помощью команды git gc --prune=now --aggressive. Это убивает записи reflog, и orphan коммиты уходят навсегда. Другая распространенная ошибка — это незнание о reflog, что может привести к ошибочному мнению, что "всё потеряно". Также важно помнить, что git reset --hard на ветке с общей историей может привести к конфликту с другими членами команды, если не было согласования.
Связанные понятия
Полезные ресурсы
Проверить знания (2)
Загрузка вопросов…