Перейти к содержанию

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%.


Назад: Clone и Fetch → | Далее: Revert →