Техническое объяснение Git / Diff Patch

Я экспериментировал с использованием git format-patch для создания патчей из одного репо и применения его к другому репо. К моему удивлению, это сработало, хотя эти два файла сильно различались. Может кто-нибудь объяснить, как именно git обрабатывает применение патча? Очевидно, он не просто использует номера строк, поэтому, если кто-то может указать мне правильное направление, это будет здорово.


person David    schedule 11.03.2011    source источник
comment
Вы можете просто посмотреть на код.   -  person Dipstick    schedule 11.03.2011
comment
В коде просто есть диапазоны номеров строк со строками + и -, которые нужно удалить и добавить.   -  person David    schedule 11.03.2011


Ответы (1)


Есть два основных способа применения исправлений к измененным файлам:

  • соответствие немодифицированным («контексту») и строкам до модификации
  • Трехстороннее слияние на основе строки индекса Git

Строки контекста (которым предшествует одиночный пробел вместо + или -) являются частью унифицированного сравнения, на котором в значительной степени основан формат сравнения Git. Это дополнительные строки, которые идентичны в «исходном» и «измененном» исходных файлах, но которые окружают измененные области. Эти контекстные строки (вместе со строками до модификации (т. Е. Удаленные / измененные строки)) используются программой, которая применяет различие, чтобы найти, где должен быть применен каждый «фрагмент» различий, даже если целевой «целевой» файл уже вставлен. или удаленные строки перед обычным целевым местоположением (нормальное местоположение определяется номерами строк, которые фактически изменились в «целевом» файле (по сравнению с «исходным» файлом) из-за вставленных / удаленных строк).

Формат Git diff также включает специальную строку «индекса» для каждого измененного файла, которая указывает идентификаторы объектов (т. Е. Сокращенные хэши SHA-1) для «исходного» и «измененного» файлов. Если в целевом репозитории есть «исходный» файл в хранилище объектов, он может использовать его для точного восстановления содержимого «измененного» файла, а затем выполнить трехстороннее слияние трех версий файла:« исходная »,« измененная »(оба исходных файла) и« цель »(место назначения файл). Это используется git am -3 и может помочь автоматически разрешить некоторые конфликты между патчем и «целевым» файлом.

person Chris Johnsen    schedule 11.03.2011