Продвинутый Git
Урок 3~15 минут
git reset и git revert: отмена изменений
Git предоставляет два способа отмены: reset для локальных изменений и revert для безопасной отмены в общих ветках.
git reset
git reset перемещает указатель ветки назад, эффективно убирая коммиты из истории.
bash
git reset --soft HEAD~1 # отменить коммит, оставить файлы в staged
git reset --mixed HEAD~1 # отменить коммит, файлы в рабочей директории (не staged)
git reset --hard HEAD~1 # отменить коммит, УДАЛИТЬ все измененияТри режима
| Флаг | Коммит | Staged | Файлы |
|---|---|---|---|
--soft | отменён | сохранён | сохранены |
--mixed (default) | отменён | очищен | сохранены |
--hard | отменён | очищен | удалены |
bash
# Исправить последний коммит (добавить забытый файл)
git reset --soft HEAD~1
git add забытый-файл.txt
git commit -m "Правильный коммит"git revert
git revert создаёт новый коммит, который отменяет изменения указанного коммита. История не переписывается.
bash
git revert abc1234 # отменить конкретный коммит
git revert HEAD # отменить последний коммит
git revert HEAD~3..HEAD # отменить последние 3 коммита (диапазон)
git revert abc1234 --no-edit # без открытия редактораКогда что использовать
git reset — только для локальных, ещё не запушенных коммитов:
- Исправить сообщение коммита
- Разбить большой коммит на несколько
- Убрать случайно добавленные файлы
git revert — для коммитов в общих ветках:
- Откатить деплой в продакшне
- Отменить фичу в main/master
- Любой коммит который уже видят другие разработчики
Восстановление после reset --hard
Даже после --hard данные не сразу исчезают из Git:
bash
git reflog # история всех перемещений HEAD
# HEAD@{2}: commit: нужный коммит
git reset --hard HEAD@{2} # вернуться к немуreflog хранит все позиции HEAD последние 90 дней.
В следующем уроке — git cherry-pick: перенос конкретных коммитов между ветками.
reset переписывает историю (опасно для shared-веток), revert создаёт новый коммит-отмену (безопасно). В публичных ветках — только revert.
↩
reset и revertИстория коммитов
f0e1d2cinit: первый коммит4b5c6d7feat: авторизацияa3f7c21fix: баг с токеном7c8d9e0feat: профиль пользователяTARGETd4e5f6awip: черновикHEADСостояние
Staging
нет
Working Dir
нет
Режим reset