Git Reset
Последнее обновление
git reset перемещает текущую ветку на другой коммит и, в зависимости от режима, обновляет индекс (область подготовки) и рабочее дерево, чтобы они соответствовали. Три режима отличаются лишь тем, насколько далеко заходит это обновление: --soft перемещает ветку и останавливается, --mixed (по умолчанию) также сбрасывает индекс, а --hard вдобавок перезаписывает ваши рабочие файлы.
Поскольку --hard отбрасывает незакоммиченную работу, определитесь с нужным режимом, прежде чем его запускать. Попробуйте эти команды безопасно в терминальном playground - настоящей оболочке в вашем браузере.
Три режима
| Mode | Moves branch | Resets staging | Resets working tree |
|---|---|---|---|
--soft | Да | Нет | Нет |
--mixed (default) | Да | Да | Нет |
--hard | Да | Да | Да |
Синтаксис
| Command | What it does |
|---|---|
git reset --soft HEAD~1 | Отменить последний коммит, оставить изменения в индексе |
git reset HEAD~1 | Отменить последний коммит, убрать изменения из индекса |
git reset --hard HEAD~1 | Отменить последний коммит, отбросить изменения |
git reset <file> | Убрать файл из индекса (сохранив его изменения) |
git reset --hard origin/main | Принудительно привести локальную ветку в соответствие с удалённой |
Частые случаи
| Goal | Command |
|---|---|
| Убрать всё из индекса | git reset |
| Убрать из индекса один файл | git reset README.md |
| Откатиться на 3 коммита назад, сохранив работу | git reset --soft HEAD~3 |
| Отбросить все локальные изменения с определённого коммита | git reset --hard <hash> |
Часто задаваемые вопросы о git reset
В чём разница между --soft, --mixed и --hard?
--soft больше ничего не меняет, поэтому ваши изменения остаются в индексе. --mixed (по умолчанию) также очищает индекс, так что изменения выходят из индекса, но остаются в ваших файлах. --hard вдобавок перезаписывает рабочее дерево, чтобы оно соответствовало целевому коммиту, отбрасывая незакоммиченные изменения.Как убрать файл из индекса с помощью git reset?
git reset <file> (например, git reset README.md) или git reset без пути, чтобы убрать из индекса всё. Это убирает файл из индекса, но сохраняет ваши правки в рабочем дереве. В новых версиях Git можно также использовать git restore --staged <file>, что делает то же самое более явно.Обратим ли git reset --hard?
--hard безвозвратно отбрасывает незакоммиченные изменения. Однако закоммиченную работу, которую вы сбросили, обычно можно восстановить: выполните git reflog, чтобы найти хеш коммита, затем git reset --hard <hash> (или создайте на нём ветку). Незакоммиченные изменения, которые никогда не добавлялись в индекс и не коммитились, восстановить нельзя, поэтому используйте --hard осторожно.В чём разница между git reset и git revert?
git reset переписывает историю, перемещая ветку назад - нормально для локальных коммитов, но опасно для коммитов, которые вы уже отправили (push). git revert оставляет историю нетронутой и добавляет новый коммит, отменяющий более ранний, что является безопасным выбором для общих веток.Могу ли я потренироваться онлайн?
git reset в настоящей оболочке в вашем браузере - ничего устанавливать не нужно. Бесплатный интерактивный курс Git от Coddy также пошагово охватывает сброс и отмену изменений.