Git revert - Отмена локальных и удаленных изменений

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

git revert - это команда для отмены некоторых существующих коммитов. "Вернуть" - фиксация означает запись нового коммита, который отменяет изменения, внесенные одним или несколькими предыдущими коммитами. (Чтобы удалить ветку, следуйте нашему руководству.)

Синтаксис команды git revert следующий, где <commit-hash> - это хэш фиксации, которую вы хотите отменить:

git revert <commit-hash> 

Примечание: Если вы укажете хэш старого коммита, git revert вернет только этот конкретный коммит, а не последующие.

Когда вы выполняете операцию возврата фиксации, Git автоматически создает новую фиксацию со следующим форматом имени:

Revert "<original-commit-message>"

This reverts commit "<commit-hash>"

Чтобы запретить git revert автоматически фиксировать изменения, используйте параметр -n или --no-commit:

git revert -n <commit-hash>

Как отменить фиксацию

Давайте посмотрим, как использовать git revert для отмены фиксации, как локально, так и удаленно.

Отменить локальную фиксацию

Процедура отмены локальной фиксации включает в себя два этапа:

  1. Используйте команду git log, чтобы определить хэш фиксации, которую вы хотите отменить:
git log

Это возвращает список последних коммитов вместе с их хэшами, как показано ниже:

commit 7c0663eba284fbaba9d238c86fa58370ec5fef04 (HEAD -> master)
Author: Antonello Zanini antonello@writech.run
Date: Fri Nov 15 12:05:56 2024 +0100

 comments added

commit 826a4cd9aee30602811b5970c9bff9e345aa26f3
Author: Antonello Zanini antonello@writech.run
Date: Fri Nov 15 12:05:28 2024 +0100

 'Hello, World!' logic added

commit 184c11bd2d20c684ece47dc732c2ac65625868ca
Author: Antonello Zanini antonello@writech.run
Date: Fri Nov 15 12:04:16 2024 +0100

 First commit
  1. Выполните git revert, чтобы отменить изменения выбранного коммита:
git revert <commit-hash>

Замените <commit-hash> на хэш фиксации, которую вы хотите отменить.

Например:

git revert 7c0663eba284fbaba9d238c86fa58370ec5fef04

Git откроет следующий файл в вашем текстовом редакторе по умолчанию (в данном случае Notepad++).:

Если вы закроете текстовый редактор без внесения каких-либо изменений, Git создаст фиксацию, используя формат сообщения по умолчанию. Результатом будет:

[master b853916] Revert "comments added"
 1 file changed, 2 deletions(-)

Убедитесь, что фиксация возврата была создана с помощью git log:

commit b8539162ff05c1783a58a52219781cef60f1c31f (HEAD -> master)
Author: Antonello Zanini <antonello@writech.run>
Date:   Fri Nov 15 12:06:45 2024 +0100

 Revert "comments added"

 This reverts commit 7c0663eba284fbaba9d238c86fa58370ec5fef04.

commit 7c0663eba284fbaba9d238c86fa58370ec5fef04
Author: Antonello Zanini <antonello@writech.run>
Date:   Fri Nov 15 12:05:56 2024 +0100

 comments added

# omitted for brevity...

Первый коммит в списке - это тот, который создается с помощью git revert.

В противном случае вы можете настроить сообщение о возврате фиксации, отредактировав сообщение по умолчанию в редакторе:

Сохраните файл, закройте редактор, и будет создана обратная фиксация с пользовательским сообщением:

commit 8cfe847922f7290c0f03d51108ac2b692298fda2 (HEAD -> master)
Author: Antonello Zanini <antonello@writech.run>
Date:   Fri Nov 15 12:14:13 2024 +0100

 "comments added" comment reverted

commit 7c0663eba284fbaba9d238c86fa58370ec5fef04
Author: Antonello Zanini <antonello@writech.run>
Date:   Fri Nov 15 12:05:56 2024 +0100

 comments added

# omitted for brevity...

Обратите внимание на сообщение о фиксации первого коммита, которое является возвратом фиксации из журнала git.

Uncover issues in your site

Learn from your users, iterate faster and build something they really want. Explore our Github repo and show your support by starring us. Explore our Github repo and show your support by starring us.

Отменить удаленную фиксацию

Процедура отмены удаленной фиксации включает в себя несколько дополнительных шагов по сравнению с отменой локальной фиксации:

  1. Используйте git checkout, чтобы переключиться на локальную ветку, соответствующую удаленной ветке, в которой вы хотите отменить фиксацию:
git checkout <branch-name>

Замените <название филиала> на название локального филиала, соответствующего удаленному филиалу.

  1. Используйте git fetch, чтобы убедиться, что ваш локальный репозиторий обновлен по сравнению с удаленным источником:
git fetch origin
  1. Если удаленная ветка опережает вашу локальную, извлеките последние изменения с пульта дистанционного управления с помощью git pull:
git pull
  1. Запустите git log, чтобы определить хэш фиксации, к которой вы хотите вернуться:
git log
  1. Запустите git revert, чтобы вернуться к указанной фиксации:
git revert <commit-hash>

Примечание: Процедура такая же, как и описанная в предыдущей главе.

  1. Загрузите изменения в удаленный репозиторий с помощью git push:
git push

Часто задаваемые вопросы

В чем разница между командами git revert и git reset?

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

Как вы указываете имя коммита, созданного git revert?

Выполните возврат без автоматической фиксации, а затем зафиксируйте его с помощью git commit и пользовательского сообщения:

git revert -n <commit-hash>
git commit -m "Custom message"

Можно ли отменить несколько коммитов одновременно?

Да, указав диапазон фиксации следующим образом:

git revert HEAD~5..HEAD

Например, приведенная выше команда создаст повторную фиксацию для каждой из последних 5 фиксаций.

Как можно запретить git revert открывать редактор?

С параметром --no-edit (без редактирования):

git revert --no-edit <commit-hash>

Вывод

Следуя процедурам, описанным в этой статье, вы можете отменить фиксации как в локальной, так и в удаленной ветке вашего репозитория Git.