git revert
Команда git revert, её отличие от git reset, параметры и примеры использования — всё на одной странице.

На этой странице описано, что делает git revert, какие параметры он принимает, полный рабочий пример, чем он отличается от git reset, как откатить коммит слияния и как разрешить конфликты, которые может породить откат.
Описание
Команда git revert — это операция отмены, направленная вперёд. В отличие от таких команд, как git reset, она не переписывает историю. Вместо того чтобы удалять или перемещать коммиты, она вычисляет обратное изменение, внесённое целевым коммитом, и записывает его как новый коммит поверх текущей ветки.
Поскольку ничего не удаляется из истории, git revert — безопасный способ отменить работу, уже отправленную в общий репозиторий: у всех, кто имеет оригинальный коммит, он сохраняется, а откат просто добавляет следующий коммит, который его аннулирует. Это сохраняет полную историю ревизий, что важно для аудита и чистого совместного сотрудничества.
Несколько важных моментов:
- Для отката нужна ссылка на коммит, чтобы знать, что именно отменять. Запуск
git revertбез аргумента завершится ошибкой. - Откат оставляет рабочее дерево в том состоянии, в каком оно было бы, если бы этого коммита никогда не существовало (относительно соседних коммитов) — это не обязательно означает пустой diff, поскольку более поздние коммиты могут затрагивать те же строки.
- Откат отката повторно применяет исходное изменение, так как обратное от обратного — это и есть оригинал.
Когда использовать git revert
Используйте git revert, когда:
- Коммит, который вы хотите отменить, уже опубликован (отправлен, открыт в pull request или получен коллегами).
- Вы хотите отменить один конкретный коммит где-то в середине истории, не затрагивая коммиты, идущие после него.
- Вам нужна аудируемая запись о том, что изменение было намеренно отменено.
Предпочитайте git reset, когда коммит локальный и неопубликованный и вы просто хотите его удалить, или git commit --amend, когда нужно исправить только последний (неотправленный) коммит.
Параметры
-e --edit | Открывает настроенный системный редактор и предлагает отредактировать сообщение коммита перед фиксацией отката. Параметр по умолчанию. |
|---|---|
--no-edit | Запрещает открытие редактора при откате (противоположность параметра -e). |
-n --no-commit | Добавляет обратные изменения в индекс подготовки и рабочий каталог вместо создания нового коммита. |
-m <parent-number> | При откате коммитов слияния указывает родительский коммит, относительно которого выполняется откат. |
Примеры
# Stage the reverted changes without committing them (useful for review)
git revert -n HEAD
# Revert a merge commit against its first parent
git revert -m 1 <merge-commit-hash>Как это работает
Как и git checkout и git reset, git revert принимает указанный коммит, но не перемещает на него указатели ссылок. Операция отката берёт указанный коммит, инвертирует внесённые им изменения и создаёт новый коммит-откат.
Пример создания репозитория:
команда git revert
mkdir git_revert_example
cd git_revert_example/
git init .
#Initialized empty Git repository in /git_revert_example/.git/
touch w3docs_file
git add w3docs_file
git commit -m "original commit"
#[master (root-commit) 299b15f] original commit
#1 file changed, 0 insertions(+), 0 deletions(-)
#create mode 100644 w3docs_file
echo "original content" >> w3docs_file
git commit -m "add new content to w3docs_file"
#[master 3602d88] add new content to w3docs_file
#1 file changed, 1 insertion(+)
echo "prepended line content" >> w3docs_file
git commit -m "prepend content to w3docs file"
#[master 86bb32e] prepend content to w3docs file
#1 file changed, 1 insertion(+)
git log --oneline
#86bb32e prepend content to w3docs file
#3602d88 add new content to w3docs file
#299b15f original commitВ этом примере репозиторий инициализируется во вновь созданной директории git_revert_example. В репозиторий выполняются 3 коммита, в которых добавляется файл w3docs_file, а его содержимое изменяется дважды. В конце настройки репозитория используется git log для отображения всех 3 коммитов в истории. Теперь можно вызвать git revert:
git revert
git revert HEAD
#[master b9cd081] Revert "prepend content to w3docs file"
#1 file changed, 1 deletion(-)git revert не сработает без передачи ссылки на коммит. В приведённом примере мы передали ссылку HEAD для отката последнего коммита. Откат создаёт новый коммит и открывает настроенный системный редактор, чтобы можно было отредактировать его сообщение (передайте --no-edit, чтобы принять сообщение по умолчанию). С помощью git log можно убедиться, что новый коммит добавлен поверх предыдущей истории:
git log --oneline
git log --oneline
#b9cd081 Revert "prepend content to w3docs file"
#86bb32e prepend content to w3docs file
#3602d88 add new content to w3docs_file
#299b15f original commitПосле отката коммит «prepend» (86bb32e) по-прежнему присутствует в истории проекта. git revert добавил новый коммит (b9cd081), который отменяет его изменения, а не удаляет его. В этом ключевое отличие от git reset.
Откат без коммита
Передайте -n (--no-commit), если хотите отменить несколько коммитов в одном объединённом откате или проверить обратные изменения перед их записью. Git подготавливает обратные изменения, но не создаёт коммит, оставляя вам полный контроль:
# Stage the inverse of the last two commits, then commit once
git revert -n HEAD~1 HEAD
git status # review the staged changes
git commit -m "Roll back the last two changes"Когда вы указываете несколько коммитов (или диапазон), Git применяет откат для каждого. Без -n будет создан один коммит на каждый откат; с -n они объединяются в единственный коммит, который вы создаёте самостоятельно.
Откат коммита слияния
Коммит слияния имеет двух родителей, поэтому Git не может самостоятельно определить, какую сторону нужно сохранить. Необходимо указать, какой родитель представляет «основную линию» для возврата, используя -m <parent-number>. Нумерация родителей начинается с 1:
# Undo a merge, keeping the first parent (usually the branch you merged into)
git revert -m 1 <merge-commit-hash>В типичном сценарии «слияние feature-ветки в main» родитель 1 — это main, а родитель 2 — feature-ветка, поэтому -m 1 отменяет изменения из feature-ветки.
Откат слияния записывает, что объединённые коммиты были отменены. Если позднее попытаться снова слить эту ветку, Git посчитает эти коммиты уже смёрженными и пропустит их. Чтобы повторно внести эту работу, обычно нужно сначала откатить сам откат. По возможности предпочитайте откат отдельных коммитов откату всего слияния.
Разрешение конфликта при откате
Если более поздние коммиты изменили те же строки, которые откат пытается отменить, Git остановится с конфликтом — точно так же, как при конфликте слияния. Отредактируйте помеченные файлы, добавьте их в индекс, затем завершите выполняющийся откат:
git revert HEAD~2
# CONFLICT (content): Merge conflict in w3docs_file
# error: could not revert 4f2a1c0... change w3docs_file
# resolve the conflict markers in the file, then:
git add w3docs_file
git revert --continue # records the revert commit
# Or, to back out of the whole operation:
git revert --abortСброс vs. откат
Команда git revert отменяет коммит, добавляя новый коммит, тогда как git reset переписывает историю, перемещая указатель ветки назад и удаляя последующие коммиты.


Откат — безопасный выбор для коммитов, уже опубликованных в общем репозитории, и позволяет целиться в конкретный коммит в любом месте истории. Избегайте git revert для приватных, неопубликованных коммитов, где git reset проще и чище.
Связанные команды
- git reset — перемещение указателя ветки и удаление последующих коммитов (отмена с перезаписью истории).
- git commit --amend — исправление последнего неотправленного коммита.
- git checkout — отмена незафиксированных изменений в рабочем дереве.
- git cherry-pick — обратная операция: применение изменений из коммита к текущей ветке.