git reset: принцип работы, практика использования Печать
Добавил(а) microsin   

Команда git reset управляет тремя ключевыми областями Git: указателем ветки (HEAD), областью подготовленных файлов (index) и рабочей директорией.

Шаг 1: изменение файлов в рабочей директории
    ↓
   [Рабочая директория ]

Шаг 2: добавление изменений в индекс с помощью git add
    ↓
   [Индекс]

Шаг 3: фиксация изменений в репозитории с помощью  git commit
    ↓
   [Репозиторий]

Разные опции git reset определяют, насколько глубоко будет произведён откат: к рабочей директории, к состоянию индекса или к фиксации (коммиту) в репозитории. Для этого вместе с командой git reset добавляют опцию режима отката: --soft, --mixed или --hard.

Сравнение трёх режимов:

Опция Перемещение HEAD Область проиндексированных файлов Рабочая директория Уровень риска
--soft ✅ Откат ❌ Без изменений (сохраняются изменения) ❌ Без изменений (сохраняются изменения) Самый низкий, только отменяет коммит
--mixed (по умолчанию) ✅ Откат ✅ Сброс (изменения возвращаются в рабочую директорию) ❌ Без изменений (сохраняются изменения) Средний, отменяет `add` и `commit`
--hard ✅ Откат ✅ Сброс ✅ Сброс (принудительная перезапись) Самый высокий, может удалить данные(*)

Примечание (*): иногда можно все-таки вернуть состояние отброшенной фиксации, если использовать её идентификатор (хеш или ORIG_HEAD). Команда reflog позволяет просмотреть информацию по всем фиксациям, даже удаленным.

[Подробное объяснение режимов]

--soft (мягкий откат)
Останавливается только на первом шаге. Перемещает указатель ветки, но ваши изменения остаются в области подготовленных файлов. Подходит для ситуаций, когда нужно переделать коммит: отменить коммит, но сохранить изменения готовыми к повторному коммиту, что эквивалентно эффекту `git commit --amend`.

--mixed (смешанный, по умолчанию)
Выполняет первые два шага. После перемещения `HEAD` также сбрасывает область подготовленных файлов в состояние нового `HEAD`, но изменения в рабочей директории сохраняются. Проще говоря, вы возвращаетесь в состояние до выполнения `git add` и `git commit`, все изменения остаются в рабочей директории, и их нужно заново добавить с помощью `git add`.

--hard (жёсткий, используйте осторожно)
Выполняет все три шага. Принудительно приводит рабочую директорию в полное соответствие с целевым коммитом. Это единственный режим в `reset`, который действительно может привести к потере данных, поскольку он напрямую перезаписывает файлы в рабочей директории. Если изменения не были закоммичены, они будут безвозвратно удалены и не могут быть восстановлены через `reflog`.

Важное напоминание: все эти режимы команды reset переписывают историю и подходят только для локальных, ещё не отправленных в удалённый репозиторий коммитов. Если коммит уже был отправлен (команда push) в общую ветку, используйте `git revert` для создания обратного коммита, чтобы не влиять на других людей.

[Ссылки]

1. Краткий справочник по Git.
2. git commit: правила хорошего тона.