Git. Возврат коммита старше HEAD завершается неудачно - PullRequest
1 голос
/ 13 марта 2020

Я пытаюсь выучить команду git revert. Я пытаюсь вернуть коммит старше HEAD. Разве это не разрешено?

$ git touch sonic
$ echo sonic >> sonic
$ git add .
$ git commit -m "sonic"
$ echo the >> sonic
$ git add .
$ git commit -m "the"
$ echo hedgehog >> sonic
$ git add .
$ git commit -m "hedgehog"
$ git log --oneline
d65e56d (HEAD -> master) hedgehog
e37fefc the
c745775 sonic

Тогда

$ git revert HEAD^
Auto-merging sonic
CONFLICT (content): Merge conflict in sonic
error: could not revert e37fefc... the
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'

Я могу сделать git revert HEAD, и это отменит d65e56d, но не git revert HEAD^. Это просто запрещено? git revert HEAD^^ тоже не работает.

1 Ответ

1 голос
/ 13 марта 2020

Это не сбой . Это тоже не успех. Это конфликт , сообщающий, что Git не удалось решить проблему с обратным применением.

Конфликт произошел из-за того, что вы коснулись соседних линий. Разница между вашей первой и второй версией гласит «добавьте слово the в конце файла после слова sonic». Чтобы отменить это, Git потребуется удалить слово the в конце файла после слова sonic, но файл на этом не заканчивается. Теперь он содержит слово hedgehog.

Фактически, Git не знает, удалять ли последнюю строку (hedgehog) или строку, содержащую слово the. * 1022. * 1 Вы можете подумать, что это очевидно, но Git просто не знает как. Таким образом, он останавливается конфликтом слияния и тремя версиями файла, доступными вам в index или области подготовки , плюс четвертого * Версия 1031 * в вашем рабочем дереве, помеченная маркерами конфликта. Теперь ваша задача - создать правильную версию конфликтующего файла.

Существует множество способов сделать это. Я склоняюсь к тому, чтобы открыть файл рабочего дерева в моем редакторе, поискать строки <<<<<<< и просмотреть строки, чтобы понять, что правильно. (Я также установил merge.conflictStyle на diff3, чтобы получить дополнительный раздел в зоне конфликта, показывая мне, что было в base версии файла, а также то, что было в двух конфликтующих версиях В этом случае это все равно не очень помогает.)

Отредактировав копию рабочего дерева файла до «правильного ответа» - что бы это ни было - я выписываю его и выхожу из редактора и запустите git add для конфликтующего файла. Теперь конфликт разрешен, используя то, что я в него вложил, независимо от того, что было в нем раньше.

Если это последний конфликт - каким он будет в этом случае - git revert --continue возобновит возврат и go для любых других коммитов, которые вы просили отменить, если они были. Поскольку больше не нужно ничего делать, это завершило бы sh возврат, и вы бы все сделали.


1 Технически, Git пытается объединить два изменения , а не просто удалить одно изменение. Один из них говорит удалить the, а другой говорит добавить hedgehog. И go в конце файла, и Git не могут найти правильный ответ.


Ошибка возврата HEAD^^ аналогична, но на этот раз строки, где Git это удалить the около строк, где Git видит добавление sonic. Проблема исчезнет, ​​если будет достаточно разрыва между различными линиями.

...