git revert
Можно сказать, что команда git revert
представляет собой типичную команду отмены. Однако принцип ее действия отличается от привычной отмены изменений. Вместо удаления коммита из истории проекта эта команда отменяет внесенные в нем изменения и добавляет новый коммит с полученным содержимым. В результате история в Git не теряется, что важно для обеспечения целостной истории версий и надежной совместной работы.
Отмена с помощью команды revert необходима, когда нужно обратить изменения, внесенные в некоем коммите из истории проекта. Это может быть полезно, если баг появился в проекте из-за конкретного коммита. Вам не потребуется вручную переходить к этому коммиту, исправлять его и выполнять коммит нового снимка состояния — команда git revert
сделает это автоматически.
Порядок действий
Команда git revert
используется для отката изменений в истории коммитов репозитория. Другие команды отмены, такие как git checkout и git reset, перемещают указатель HEAD
и указатели ветки на определенный коммит. Команда git revert
также работает с определенным коммитом, однако использование git revert
не перемещает указатели. При операции revert совершается переход к указанному коммиту, обращаются его изменения и создается новый, «обратный» коммит. Затем позиция указателей обновляется — они перемещаются к этому коммиту в конце ветки.
Для наглядности создадим тестовый репозиторий и напишем в командной строке следующее:
$ 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"
[main (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"
[main 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"
[main 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
СМ. РЕШЕНИЕ
Изучите Git с помощью Bitbucket Cloud
Мы выполнили инициализацию репозитория в новом каталоге git_revert_test
. В репозитории мы выполнили 3 коммита: добавили файл demo_file
и дважды изменили его содержимое. В конце настройки репозитория мы запустили команду git log
, чтобы просмотреть историю коммитов (в ней содержится 3 коммита). Теперь из этого состояния репозитория можно запустить команду git revert
.
$ git revert HEAD
[main 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 revert
не будет создавать новый коммит, обратный целевому по своему содержимому. Вместо этого обращенные изменения будут добавлены в раздел проиндексированных файлов и рабочий каталог. Это другие деревья, с помощью которых Git управляет состоянием репозитория. Подробную информацию см. на странице команды git reset.
Разница между командами git reset и git revert
Важно понимать, что команда git revert
отменяет одиночный коммит, но не возвращает проект в предшествовавшее состояние с удалением всех последующих коммитов. Такой результат в Git дает команда reset, а не revert.
У команды revert есть два серьезных преимущества перед командой reset. Во-первых, она не изменяет историю проекта и, соответственно, безопасна для коммитов, которые уже опубликованы в общем репозитории. Подробнее о том, почему изменять общую историю опасно, см. на странице команды git reset.
Во-вторых, целью для команды git revert
можно выбрать любой отдельный коммит в истории проекта, в то время как действие команды git reset
может отменить только коммит, предшествующий текущему. Если бы возникла необходимость отменить старый коммит с помощью git reset
, пришлось бы удалить все коммиты после целевого, затем удалить его и выполнить все последующие коммиты заново. Очевидно, это не лучший способ отмены. Подробные сведения о различиях между командой git revert
и другими командами отмены см. на странице Команды reset, checkout и revert.
Резюме
Команда git revert
— это операция для безопасной отмены изменений, действие которой направлено в будущее. Для отката изменений команда не удаляет из истории коммиты или родительские элементы, a создает новый коммит с отменой нужных действий. Использовать команду git revert
безопаснее, потому что она не создает угрозу потери кода, в отличие от git reset
. Чтобы показать применение команды git revert
, в примерах использовались другие команды. Подробные сведения о них см. на страницах команд git log, git commit и git reset.
Поделитесь этой статьей
Следующая тема
Рекомендуемые статьи
Добавьте эти ресурсы в закладки, чтобы изучить типы команд DevOps или получать регулярные обновления по DevOps в Atlassian.