Можно сказать, что команда git revert представляет собой типичную команду отмены. Однако принцип ее действия отличается от привычной отмены изменений. Вместо удаления коммита из истории проекта эта команда отменяет внесенные в нем изменения и добавляет новый коммит с полученным содержимым. В результате история в Git не теряется, что важно для обеспечения целостной истории версий и надежной совместной работы.

Отмена с помощью команды revert необходима, когда нужно обратить изменения, внесенные в некоем коммите из истории проекта. Это может быть полезно, если баг появился в проекте из-за конкретного коммита. Вам не потребуется вручную переходить к этому коммиту, исправлять его и выполнять коммит нового снимка состояния — команда git revert сделает это автоматически.

git revert — обучающие руководства Atlassian по Git

Порядок действий

$ mkdir git_revert_test
$ cd git_revert_test/
$ git init .
Initialized empty Git repository in /git_revert_test/.git/
$ touch demo_file
$ git add demo_file
$ git commit -am"initial commit"
[master (root-commit) 299b15f] initial commit
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 demo_file
$ echo "initial content" >> demo_file
$ git commit -am"add new content to demo file"
[master 3602d88] add new content to demo file
n 1 file changed, 1 insertion(+)
$ echo "prepended line content" >> demo_file
$ git commit -am"prepend content to demo file"
[master 86bb32e] prepend content to demo file
 1 file changed, 1 insertion(+)
$ git log --oneline
86bb32e prepend content to demo file
3602d88 add new content to demo file
299b15f initial commit

Мы выполнили инициализацию репозитория в новом каталоге git_revert_test. В репозитории мы выполнили 3 коммита: добавили файл demo_file и дважды изменили его содержимое. В конце настройки репозитория мы запустили команду git log, чтобы просмотреть историю коммитов (в ней содержится 3 коммита). Теперь из этого состояния репозитория можно запустить команду git revert.

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

Команда git revert не будет работать, если не передана ссылка на коммит. В примере мы указали ссылку HEAD. Это позволит обратить изменения последнего коммита. То же самое произошло бы при откате до коммита 3602d8815dbfa78cd37cd4d189552764b5e96c58. Как и слияние, операция отката создаст новый коммит. При этом откроется настроенный системный редактор с предложением ввести комментарий. После ввода и сохранения комментария Git продолжит операцию. Теперь мы можем узнать состояние репозитория с помощью команды git log. Мы видим, что к журналу добавлен новый коммит:

$ git log --oneline 1061e79 Revert "prepend content to demo file" 86bb32e prepend content to demo file 3602d88 add new content to demo file 299b15f initial commit

Обратите внимание, что после операции отмены третий коммит по-прежнему содержится в истории проекта. Вместо его удаления команда git revert добавила новый коммит для отмены изменений. В результате второй и четвертый коммиты представляют собой одну и ту же базу кода, а третий коммит хранится в истории на случай, если в дальнейшем нам понадобится к нему вернуться.

Распространенные опции

-e
--edit

Это параметр по умолчанию, указывать его необязательно. Он открывает настроенный системный редактор, в котором вам будет предложено изменить комментарий к коммиту перед выполнением отмены

--no-edit

Действие этого параметра обратно действию -e. Редактор во время выполнения отмены не откроется.

-n
--no-commit

Разница между командами git reset и git revert

Важно понимать, что команда git revert отменяет одиночный коммит, но не возвращает проект в предшествовавшее состояние с удалением всех последующих коммитов. Такой результат в Git дает команда reset, а не revert.

Сравнение git revert и git reset — обучающие руководства Atlassian по Git

Готовы изучить команду git revert?

Ознакомьтесь с этим интерактивным обучающим руководством.

Начните прямо сейчас