В целевом файле есть пара дополнительных строк над измененной строкой. Это не так, потому что git не может определить, где изменяется одна строка?
Да, это так. Git проверяет не только конкретное c изменение (добавьте это, удалите это), но также контекст , в котором происходит изменение . Если контекст не совпадает, патч не применяется.
Использование -3
или --3way
может помочь: идея, лежащая в основе этой опции, заключается в том, что если исправление было выполнено для версии файла, который вы do иметь, в вашем Git репозитории, Git может извлечь эту версию файла, сравнить эту версию с текущей версией, посмотреть, что изменен в вашей копии файла и объединит (как в операциях стиля git merge
) ваши изменения и их изменения. Графически представьте себе следующее:
...--o--o--B--o--o--o--C <-- your current commit and copy of the file
\
D <-- the commit from which the patch was generated
Коммит B
- это базовая версия, которую разделяют ваш коммит C
и их коммит D
. Патч изменяет базовую версию файла. Ваш коммит C
имеет другую версию того же файла , но при сравнении D
vs B
- т.е., что в патче - и , сравнивая C
vs B
в то же время Git может самостоятельно выяснить, как применить патч, в конце концов.
Уловка здесь в том, чтобы понять, где Git появляется с файл из коммита B
. Ответ на этот вопрос находится в строке index
, если она есть, в патче. index
дает Git информацию, необходимую для поиска копии файла, который будет в фиксации B
- при условии, конечно, что у вас действительно есть эта копия файла в вашем репозитории.