Reset и Restore: Отмена изменений¶
Git предоставляет несколько способов отмены изменений в зависимости от того, на какой стадии находятся изменения.
Git Restore (Восстановление файлов)¶
Команда restore (появилась в Git 2.23) предназначена для отмены изменений в рабочей директории и индексе. Это более понятная альтернатива старому checkout для работы с файлами.
Отмена изменений в рабочем файле¶
Если вы изменили файл, но еще не добавили его в индекс (git add):
git restore <имя_файла>
Вернет файл к состоянию последнего коммита. Все несохраненные изменения будут потеряны.
Удаление файла из индекса (отмена git add)¶
Если вы уже сделали git add, но хотите убрать файл из индекса, оставив изменения в файле:
git restore --staged <имя_файла>
Файл останется измененным в рабочей папке, но будет помечен как "не добавленный".
Комбинирование¶
Можно сделать и то, и другое одновременно:
git restore --staged --worktree <имя_файла>
Уберет из индекса и отменит все изменения в файле.
Git Reset (Сброс состояния)¶
reset — более мощная и потенциально опасная команда. Она перемещает указатель текущей ветки на другой коммит и (в зависимости от флага) меняет индекс и рабочую директорию.
Типы сброса¶
1. Soft Reset (Мягкий сброс)¶
git reset --soft HEAD~1
- Перемещает указатель ветки на коммит назад.
- Оставляет изменения в индексе (готовыми к коммиту).
- Оставляет изменения в рабочей папке.
Зачем: Если вы сделали коммит, но поняли, что забыли добавить файл или хотите изменить сообщение. Отменяет только сам коммит.
2. Mixed Reset (Смешанный сброс, по умолчанию)¶
git reset HEAD~1
# или явно
git reset --mixed HEAD~1
- Перемещает указатель ветки назад.
- Очищает индекс (убирает файлы из staged).
- Оставляет изменения в рабочей папке.
Зачем: Самый частый сценарий. Вы сделали коммит, но решили переделать его, разбить на несколько или изменить состав файлов.
3. Hard Reset (Жесткий сброс)¶
git reset --hard HEAD~1
- Перемещает указатель ветки назад.
- Очищает индекс.
- Удаляет все изменения в рабочей папке.
⚠️ Опасно! Все несохраненные изменения будут безвозвратно потеряны. Используйте только если уверены, что изменения не нужны.
Сброс на конкретный коммит¶
Можно сброситься не на один коммит назад, а на любой конкретный:
git reset --soft a1b2c3d
git reset --mixed a1b2c3d
git reset --hard a1b2c3d
Где a1b2c3d — хеш коммита.
Сброс удаленной ветки (опасно!)¶
Если вы случайно запушили неверные коммиты и нужно откатить удаленную ветку:
# Локально откатываемся
git reset --hard HEAD~2
# Пушим с принудительной перезаписью
git push --force-with-lease origin main
Внимание: Никогда не делайте этого в общих ветках (
main,develop), над которыми работают другие люди! Это сломает их локальные копии.
Сравнение Restore и Reset¶
| Задача | Команда |
|---|---|
| Отменить изменения в файле (до add) | git restore <файл> |
| Убрать файл из индекса (после add) | git restore --staged <файл> |
| Отменить последний коммит, сохранив изменения в индексе | git reset --soft HEAD~1 |
| Отменить коммит и убрать из индекса | git reset HEAD~1 |
| Полностью отменить коммит и все изменения | git reset --hard HEAD~1 |
Совет: Для новичков рекомендуется использовать
restoreдля работы с файлами иreset --soft/--mixedдля отмены коммитов. Избегайте--hard, если не уверены на 100%.