Продвинутый Git
1rebase: линейная история2stash: прячем незавершённую работу3git reset и git revert: отмена изменений← вы здесь4cherry-pick: перенос конкретных коммитов5tags: версионирование релизов6Git Workflows: GitFlow, GitHub Flow, Trunk-based
📖 Полная статья по теме →
Урок 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: профиль пользователяTARGET
d4e5f6awip: черновикHEAD
Состояние
Staging
нет
Working Dir
нет
Режим reset
УГЛУБЛЁННОЕ ЧТЕНИЕ
Полная статья: Продвинутый Git
Теория, примеры и разбор темы в одном месте