← Назад к вопросам

Что такое Git reset?

1.6 Junior🔥 161 комментариев
#Git и CI/CD

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Git reset — откат изменений

Git reset — это команда для отката коммитов и управления staging area. Это один из самых мощных, но и опасных инструментов в Git. Важно понимать её правильно, чтобы не потерять работу.

Три режима reset

Команда git reset имеет три основных флага, которые определяют поведение:

1. --soft (мягкий откат)

Отменяет коммиты, но оставляет изменения в staging area (индексе). Полезно, когда нужно переделать последний коммит.

// В Git истории было:
// HEAD -> Commit C (с изменениями в файлах)

git reset --soft HEAD~1

// После этого:
// HEAD -> Commit B
// Изменения из C остаются в staging area (git add)
// Можешь переделать коммит с другим сообщением

2. --mixed (смешанный откат) — по умолчанию

Отменяет коммиты и убирает изменения из staging area, но сохраняет их в рабочей директории. Это поведение по умолчанию.

# Эти две команды эквивалентны
git reset HEAD~1
git reset --mixed HEAD~1

# После выполнения:
# - Коммит отменён
# - Изменения остаются в рабочей директории (untracked)
# - Можешь заново выбрать, что добавить

3. --hard (жёсткий откат)

Отменяет коммиты и безвозвратно удаляет изменения. Это опасная операция!

git reset --hard HEAD~1

# После этого:
# - Коммит полностью удалён
# - Изменения безвозвратно потеряны
# - Рабочая директория соответствует HEAD~1

Практические примеры

Сценарий 1: Переделать последний коммит

# Хотел добавить файл, но забыл
git add forgotten_file.txt
git reset --soft HEAD~1
git add .
git commit -m "Правильный коммит с обоими файлами"

Сценарий 2: Убрать файл из коммита, но сохранить изменения

# В коммите есть secret.env, который не должен быть там
git reset --mixed HEAD~1
git checkout secret.env  # восстанавливаем файл из гита
git add .
git commit -m "Коммит без secret.env"

Сценарий 3: Полностью отменить последний коммит (когда понял, что он неправильный)

git reset --hard HEAD~1
# Работа потеряна, но это было необходимо

Сценарий 4: Откатиться на несколько коммитов назад

# Посмотрели логию
git log --oneline
# Вывод:
# a1b2c3d Latest commit
# e4f5g6h Middle commit
# i7j8k9l Old commit (сюда хотим вернуться)

git reset --mixed i7j8k9l
# Вернулись на Old commit, изменения в рабочей директории

Разница между reset, revert и checkout

# git reset — перемещает HEAD, стирает коммиты (опасно в shared branches)
git reset --hard HEAD~1

# git revert — создаёт новый коммит с противоположными изменениями (безопасно)
git revert HEAD~1

# git checkout — переключается между веток или восстанавливает файл
git checkout file.txt

Когда использовать каждый режим

--soft:

  • Переделать сообщение коммита
  • Объединить несколько мелких коммитов
  • Добавить забытый файл в коммит

--mixed (по умолчанию):

  • Убрать файлы из коммита, сохраняя изменения
  • Пересоздать коммит с другим составом файлов
  • Когда нужно проверить, что ты отката

--hard:

  • Только в локальной ветке, если ты уверен
  • После git reset --hard, изменения потеряны навсегда
  • Избегай на shared branches (используй git revert)

Восстановление после ошибки

Если случайно сделал git reset --hard и потерял работу:

# Git хранит историю reflog
git reflog
# Найди нужный коммит, например ab12cd34

git reset --hard ab12cd34
# Работа восстановлена!

Лучшие практики

  1. На локальной ветке — можешь использовать --hard без опасений
  2. На shared branches (main, develop) — НИКОГДА не используй git reset
  3. Для shared branches — используй git revert для отката коммитов
  4. Проверь перед reset — используй git log и git diff перед выполнением
  5. Используй reflog — как страховка при ошибке