Git / Diff Patch техническое объяснение - PullRequest
6 голосов
/ 11 марта 2011

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

1 Ответ

8 голосов
/ 11 марта 2011

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

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

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

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

...