Я запутался в том, как работает git revert

Я хочу знать, что происходит. Я создал файл HTML и поместил в него несколько строк

this is first line
this is second line
this is third line
this is fourth line

и фиксируются после каждой строки, например, commit a, commit b, commit c, commit d соответственно.

Теперь я выполнил возврат к фиксации c, но он выдает ошибку:

could not revert 82b69e5... c

hint: after resolving the conflicts, mark the corrected paths <br>
hint: with 'git add <paths>' or 'git rm <paths>' <br>
hint: and commit the result with 'git commit'<br>

Я хочу знать, как работает git-revert. Я знаю что-то вроде «отменяет фиксацию и добавляет новую фиксацию», но не знаю, как ее успешно использовать.


person Prashant Singh    schedule 10.04.2019    source источник
comment
Я почти уверен, что здесь, в Stack Overflow, есть дубликаты, которые уже отвечают на этот вопрос.   -  person Lasse V. Karlsen    schedule 10.04.2019
comment
Как и ответил здесь, git revert отменяет изменения, внесенные одним коммитом сделав еще один коммит, который удалит эти изменения. Если исходная фиксация добавила строку, обратная фиксация удалит эту строку. Если исходная фиксация удалила строку, обратная фиксация вернет ее. Если исходная фиксация изменяет строку, возврат попытается отменить эти изменения.   -  person Lasse V. Karlsen    schedule 10.04.2019
comment
Причина, по которой вы получили сообщение об ошибке, заключается в конфликте, изменения, внесенные коммитом c, слишком близки к изменениям, внесенным в другие коммиты, и, таким образом, git защищает, прося вас разрешить конфликт, по сути выяснить, что правильно результат должен быть.   -  person Lasse V. Karlsen    schedule 10.04.2019
comment
@LasseVågsætherKarlsen ваше предложение сработало для меня, возможно, я не оставлял много места.   -  person Prashant Singh    schedule 10.04.2019


Ответы (2)


Он создает инвертирующий патч для фиксации, которую вы хотите отменить, поэтому в вашем случае фиксация c выглядела так:

 this is first line
 this is second line
+this is third line
# End of file

Затем из d вы запускаете git revert c, поэтому он пытается создать следующее и применить его к вашему дереву:

 this is first line
 this is second line
-this is third line
# End of file

Однако ваш файл выглядит так:

this is first line
this is second line
this is third line
this is fourth line
# End of file

Таким образом, созданный патч не применяется (конфликт конца файла и четвертой строки). Итак, когда Git говорит вам:

could not revert 82b69e5... c
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add ' or 'git rm '
hint: and commit the result with 'git commit'

Это означает «Я пытался сделать то, что вы просили, но я столкнулся с делом, которое не могу решить», поэтому вам нужно:

Скорее всего, ваше решение будет таким:

this is first line
this is second line
this is fourth line
person padawin    schedule 10.04.2019
comment
Наличие конфликта не является проблемой само по себе. Это совершенно нормально, когда два изменения происходят в одном и том же месте. Отвечает ли это, однако, на ваш вопрос о том, как работает git revert? - person padawin; 10.04.2019
comment
да, у меня возникли трудности с разрешением конфликта слияния. Я исправил конфликт, а затем после этого использовал git revert --continue. Это решило мою проблему - person Prashant Singh; 10.04.2019

Команду git revert можно рассматривать как команду типа «отменить», однако это не традиционная операция отмены.

По сути, он отменяет все, что было сделано в указанном коммите, а затем создает новый коммит в процессе. Вы можете проверить здесь для получения дополнительной информации.

И что касается вашей проблемы, вы получаете конфликты слияния. Для устранения этих конфликтов вы можете использовать git mergetools (например, Meld).

person shrikant1712    schedule 10.04.2019