git revert — Безопасная отмена коммитов
Команда git revert создаёт новый коммит, который отменяет изменения из предыдущего коммита. В отличие от git reset, она не переписывает историю — она дополняет её.
Revert vs Reset
git revert | git reset | |
|---|---|---|
| История | Сохраняется (добавляется новый коммит) | Переписывается (коммиты удаляются) |
| Общие ветки | Безопасно | Опасно |
| Способ отмены | Создаёт обратный коммит | Перемещает HEAD назад |
Используйте git revert, когда коммит, который вы хотите отменить, уже отправлен в общую ветку. Используйте git reset только для локальной, неотправленной работы.
Как это работает
A — B — C — D (до revert)
↓
A — B — C — D — D' (после git revert D)
Коммит D' содержит точную противоположность изменений из D. Исходный коммит D остаётся в истории.
Основное использование
git revert HEAD # Отменить последний коммит
git revert abc1234 # Отменить конкретный коммит по SHA
git revert HEAD~2 # Отменить коммит, который два коммита до HEAD
Git откроет ваш редактор для написания сообщения коммита. Сообщение по умолчанию описывает, какой коммит был отменён.
Попробуйте!
Попрактикуйтесь в отмене коммита:
- Создайте файл и закоммитьте его:
echo "hello" > greeting.txt && git add greeting.txt && git commit -m "Add greeting"
- Сделайте второй коммит:
echo "goodbye" >> greeting.txt && git add greeting.txt && git commit -m "Add farewell"
- Проверьте файл:
cat greeting.txt— показывает обе строки - Отмените второй коммит:
git revert HEAD --no-edit - Проверьте файл снова:
cat greeting.txt— показывает только "hello" - Проверьте лог:
git log --oneline— видны все три коммита, включая revert
Отмена старых коммитов
Вы можете отменить любой коммит, не только последний. Git разберётся, какие изменения нужно отменить:
git log --oneline # Найдите SHA коммита
git revert abc1234 # Отмените этот конкретный коммит
Если отмена вызывает конфликт (потому что более поздние коммиты зависят от отменяемых изменений), Git попросит вас разрешить его вручную.
Ключевые моменты
git revertбезопасен для общих/публичных веток — он никогда не переписывает историю- Он создаёт новый коммит, отменяющий изменения целевого коммита
- Исходный коммит остаётся в логе для отслеживаемости
- Если возникают конфликты, разрешите их и выполните
git revert --continue