|
Команда 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: правила хорошего тона. |