Как использовать 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