git reset --hard переносит текущую ветку на указанный коммит и принудительно делает индекс и рабочую директорию точной копией этого коммита. Все незакоммиченные изменения в файлах и индексе безвозвратно удаляются. Коммиты, от которых вы "оторвали" ветку, ещё можно попытаться восстановить через git reflog.
Команда git reset управляет тремя сущностями: указателем ветки (через HEAD), индексом (staging area) и рабочей директорией. Флаг --hard говорит Git изменить все три сразу: куда указывает ветка, какие файлы считаются подготовленными к коммиту и какое содержимое файлов лежит у вас в рабочем каталоге.
При выполнении git reset --hard <target> текущая ветка начинает указывать на коммит <target>, индекс перезаписывается снимком файлов из этого коммита, а рабочая директория приводится в точное соответствие этому снимку. Все незакоммиченные изменения (и в индексе, и на диске) при этом пропадают.
--hard. Обновляет ссылку ветки (через HEAD), полностью пересобирает индекс по целевому коммиту и перезаписывает рабочую директорию под тот же самый коммит. Итоговое состояние выглядит так, будто вы только что сделали git clone или git checkout именно этого коммита.git reset. По умолчанию используется режим --mixed: меняется ветка и индекс, но файлы на диске не трогаются. В режиме --soft меняется только указатель ветки, а индекс и рабочая директория остаются как есть. Вариант --hard самый радикальный: он затирает и индекс, и рабочие файлы, подгоняя всё под целевой коммит.git reset --hard HEAD~1), то сами коммиты становятся недостижимыми из веток, но их ещё можно попытаться найти и вернуть через git reflog, пока сборщик мусора их окончательно не удалил.git reset --hard origin/main), если локальная история сломана; подготовка ветки перед форсированным пушем, когда нужно переписать локальную историю коммитов.Пример: полностью отменить последний коммит и все локальные изменения после него.
После этой команды указатель ветки сдвинется на предыдущий коммит, а git status покажет чистое дерево: как будто последнего коммита и всех последующих правок никогда не было.
Ещё один пример: жёстко выровнять локальную ветку под состояние удалённой, отбросив все локальные изменения.
Такой приём удобно использовать, когда локальная ветка сильно разошлась с удалённой и локальные изменения не представляют ценности, но его нельзя применять, если в ветке есть важные незапушенные коммиты или незакоммиченные правки.
Отметьте свой прогресс