Git / Diff Patch技术说明

时间:2011-03-11 00:19:34

标签: git diff patch

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

1 个答案:

答案 0 :(得分:8)

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

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

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

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