Git/Diff Patch技术说明

Dav*_*vid 6 git diff patch

我正在尝试使用git format-patch从一个repo创建补丁并将其应用到另一个repo.令我惊讶的是,即使这两个文件非常不同,它也能正常工作.有人可以解释git如何处理应用补丁的技术问题吗?显然它不只是使用行号,所以如果有人能指出我正确的方向,那将是非常棒的.

Chr*_*sen 8

补丁可以应用于修改文件的两种主要方式:

  • 匹配未修改("上下文")和预修改行
  • 基于Git的"索引"行的3向合并

上下文行(前面是单个空格而不是+or -)是统一diff格式的一部分,Git的diff格式主要基于这种格式.它们是"原始"和"修改"源文件中相同但在修改后的区域周围的额外行.这些上下文行(连同预修改行(即删除/更改的行))由应用diff的程序使用,以查找应该应用每个diff"hunk"的位置,即使目标"target"文件已经插入或删除正常目标位置之前的行(正常位置由行号指定,由于插入/删除行而在"目标"文件(相对于"原始"文件)中有效更改).

Git的diff格式还为每个修改过的文件包含一个特殊的"索引"行,用于指示"原始"和"已修改"文件的对象ID(即缩写的SHA-1哈希).如果目标存储库在其对象存储库中具有"原始"文件,则可以使用它来精确地重建"已修改"文件的内容,然后在文件的三个版本之间执行三向合并:"original", "已修改"(源文件)和"目标"(目标文件).这git am -3可以帮助自动解决补丁和"目标"文件之间的一些冲突.