Перейти к содержимому

git revert

git revert

Описание

Команда git revert — это операция «отмены». В отличие от других команд отмены, она не переписывает историю. Команда git revert отменяет изменения, внесённые коммитом, и добавляет новый коммит с обратным содержимым. Это не позволяет Git потерять историю, что имеет решающее значение для целостности истории изменений и правильной совместной работы. Отмена изменений используется для применения обратного коммита из истории проекта. Вы можете использовать git revert для автоматического возврата и внесения исправлений.

Параметры

-e --editОткрывает настроенный системный редактор и предлагает отредактировать сообщение коммита перед фиксацией отмены. Параметр по умолчанию.
--no-editНе открывает редактор при отмене (противоположность параметру -e).
-n --no-commitДобавляет обратные изменения в индекс подготовки (Staging Index) и рабочую директорию вместо создания нового коммита.
-m <parent-number>При отмене слияний указывает родительский коммит, относительно которого выполняется отмена.

Примеры

bash
# 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

bash
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

bash
git revert HEAD
#[master b9cd081] Revert "prepend content to w3docs file"
#1 file changed, 1 deletion(-)

Команда git revert не сработает без указания ссылки на коммит. В приведённом примере она была передана через ссылку HEAD для отмены последнего коммита. Отмена создаёт новый коммит, после чего открывается настроенный системный редактор для создания сообщения нового коммита. Мы можем использовать git log и увидеть новый коммит, добавленный в предыдущий журнал:

git log --oneline

bash
git log --oneline
#2365e21 Revert "prepend content to w3docs_file"
#23ab21e prepend content to w3docs file
#3602d88 add new content to w3docs_file
#345b23f original commit

После отмены третий коммит всё ещё остаётся в истории проекта. git revert добавил новый коммит для отмены его изменений вместо удаления.

Отмена изменений (revert) и сброс (reset)

Команда git revert отменяет только один коммит, тогда как git reset возвращает проект к предыдущему состоянию путём удаления последующих коммитов.

git revert

git revert1

Отмена изменений считается безопасной операцией для коммитов, опубликованных в общем репозитории. Ещё одно преимущество отмены — возможность воздействовать на конкретный коммит в произвольной точке истории. Избегайте использования git revert для частных или неопубликованных коммитов, где более эффективен git reset. Подробную информацию о git reset см. на следующей странице.

Практика

Каковы особенности и параметры команды 'git revert'?

Считаете ли это полезным?

Предпросмотр dual-run — сравните с маршрутами Symfony на продакшене.