【问题标题】:Git/Diff Patch technical explanationGit/Diff 补丁技术说明
【发布时间】:2011-03-11 00:19:33
【问题描述】:

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

【问题讨论】:

  • 你可以看看代码。
  • 该代码只有行号范围,其中包含要删除和添加的 + 和 - 行。

标签: git diff patch


【解决方案1】:

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

  • 匹配未修改(“上下文”)和修改前的行
  • 基于 Git 的“索引”行的 3 路合并

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-13
    • 1970-01-01
    • 2018-08-25
    • 1970-01-01
    • 2015-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多