Git/Diff Patch 技术讲解

标签 git diff patch

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

最佳答案

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

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

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

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

关于Git/Diff Patch 技术讲解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5267577/

相关文章:

git - 蓝调 : How I can configure a delivery pipeline stage build to tag git?

git - 检查 git repo 中是否存在分支而不进行克隆

git - 如何查找或更改 Git 存储库服务器的 url

linux - 如何应用压缩补丁?

svn - TortoiseSvn 合并后创建补丁不包含新文件

git - 克隆 GitHub 存储库的内容(没有文件夹本身)

git - 如何让 gitweb 忽略空格更改?

maven-2 - 是否有可以比较文件并将结果输出到文件的maven插件?

plugins - Notepad++中是否有用于修补文件的差异补丁插件?

patch - 有没有办法检查 ansible 是否应用了补丁?