Как использовать Git Revert

Как используется git revert?

Это может звучать как повторяющийся вопрос, но когда люди его спрашивают, часто возникает ответ, используйте git reset в соответствии с Возвратитесь к фиксации с помощью SHA-хэша в Git?

Затем, когда кто-то спрашивает, как использовать git reset, люди ответят, что вам следует использовать git revert как Git - как откат

Прежде чем вы это узнаете, появилось 8 разных людей с их собственными уникальными способами спасти задницу OP, все это над вашей головой.

Так что давайте попробуем и приложим краткое описание и напишем руководство Dummies на git revert.

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

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

Вот что такое контроль источника. Я уверен, что это легко.

Хорошо, вы собираетесь использовать git revert, но как?

И после запуска git revert вам нужно сделать что-то еще после? Вам нужно зафиксировать сделанные изменения или сделать возврат непосредственно к репо или что?

Очевидно, вам нужно будет снова нажать и, возможно, объявить свои шары команде.

Ответ 1

git revert делает новую фиксацию

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

Он оставляет файлы в том же состоянии, что и в случае, если исправление, которое было отменено, никогда не существовало. Например, рассмотрим следующий простой пример:

$ cd /tmp/example
$ git init
Initialized empty Git repository in /tmp/example/.git/
$ echo "Initial text" > README.md
$ git add README.md
$ git commit -m "initial commit"
[master (root-commit) 3f7522e] initial commit
 1 file changed, 1 insertion(+)
 create mode 100644 README.md
$ echo "bad update" > README.md 
$ git commit -am "bad update"
[master a1b9870] bad update
 1 file changed, 1 insertion(+), 1 deletion(-)

В этом примере история фиксации имеет две фиксации, а последняя - ошибка. Используя git revert:

$ git revert HEAD
[master 1db4eeb] Revert "bad update"
 1 file changed, 1 insertion(+), 1 deletion(-)

В журнале будет 3 записи:

$ git log --oneline
1db4eeb Revert "bad update"
a1b9870 bad update
3f7522e initial commit

Итак, существует последовательная история того, что произошло, но файлы выглядят так, как будто плохое обновление никогда не происходило:

cat README.md 
Initial text

Не имеет значения, где в истории фиксация должна быть возвращена (в приведенном выше примере последняя фиксация отменена - любое фиксация может быть отменена).

Закрытие вопросов

Вам нужно сделать что-то еще после?

A git revert - это просто еще одна фиксация, т.е. нажмите на пульт дистанционного управления, чтобы другие пользователи могли вытащить/извлечь/слить изменения, и все готово.

Вам нужно зафиксировать сделанные изменения или выполнить возврат непосредственно к репо?

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

Очевидно, вам нужно снова нажать и, возможно, объявить команде.

В самом деле - если удаленный компьютер находится в неустойчивом состоянии - общение с остальной частью команды, которое им нужно потянуть, чтобы получить исправление (реверсивная фиксация), будет правильным:

Ответ 2

Используйте git, как показано ниже:

git revert <insert bad commit hash here>

git revert создает новую фиксацию с откатными изменениями. git reset стирает вашу историю git вместо создания нового коммита.

Последовательность шагов такая же, как и любая другая фиксация.

Ответ 3

Причина reset и revert часто встречается в одних и тех же разговорах, потому что разные системы контроля версий используют их для обозначения разных вещей.

В частности, люди, которые привыкли к SVN или P4 и хотят отбросить незафиксированные изменения в файле, часто обращаются за revert прежде чем им скажут, что они действительно хотят reset.

Точно так же эквивалент revert в других VCS часто называют rollback или чем-то подобным, но "откат" также может означать "Я хочу полностью отказаться от последних нескольких коммитов", что подходит для reset но не для revert. Таким образом, существует большая путаница, когда люди знают, что они хотят делать, но не ясно, какую команду им следует использовать для этого.

Что касается ваших актуальных вопросов о возвращении...

Хорошо, вы собираетесь использовать Git Revert, но как?

git revert first-bad-commit..last-bad-commit

А после запуска git revert нужно ли делать что-то еще после? Нужно ли фиксировать изменения, которые были сделаны, или они возвращаются напрямую в репо или как?

По умолчанию git revert запрашивает сообщение о коммите, а затем фиксирует результаты. Это может быть отменено. Я цитирую справочную страницу:

--edit

С этой опцией, git revert позволит вам отредактировать сообщение коммита до совершения возврата. Это значение по умолчанию, если вы запускаете команду из терминала.

--no фиксации

Обычно команда автоматически создает некоторые коммиты с сообщениями журнала коммитов, в которых указывается, какие коммиты были отменены. Этот флаг применяет изменения, необходимые для возврата именованных коммитов к вашему рабочему дереву и индексу, но не делает коммиты. Кроме того, когда используется эта опция, ваш индекс не должен соответствовать фиксации HEAD. Отмена выполняется относительно начального состояния вашего индекса.

Это полезно при возврате эффекта более одного коммита в ваш индекс подряд.

В частности, по умолчанию он создает новый коммит для каждого коммита, который вы возвращаете. Вы можете использовать revert --no-commit для создания изменений, отменяя их все, не фиксируя эти изменения как отдельные коммиты, а затем фиксируйте на досуге.

Ответ 4

Я вернул назад несколько коммитов, запустив 'git revert commit id', такой как:

git revert b2cb7c248d416409f8eb42b561cbff91b0601712

Затем мне предложили зафиксировать возврат (так же, как при запуске 'git commit'). Моя терминальная программа по умолчанию - Vim, поэтому я запустил:

:wq 

Наконец, я отправил изменения в хранилище:

git push