给定两个文件,git diff 或任何 diff 工具如何判断哪些行已被添加、修改或删除?
是否存在可能无法识别已编辑行的正确状态的边缘情况?
编辑:这个问题更关心差异如何发生的实际方法
最佳答案
Git 存储快照:给定您选择的任意两个快照,Git 会提取您想要比较的文件1到临时区域2,然后运行“diff两个文件上的“引擎”。该引擎的结果是,或者应该是,一系列指令,在应用这些指令时,会将左侧文件转换为右侧文件。
Git 有几个内置的 diff 引擎,Git 称之为:
myers
:这使用 algorithm by Eugene W Myers有一些细微的修改。 StackOverflow 有许多关于 Myers diff 的问题和解答:Myers diff algorithm vs Hunt–McIlroy algorithm ; Diff Algorithm? (有多个答案,但有几个关于迈尔斯差异); Myers' diff: Why V[k − 1] < V[k + 1] guarantee to choose the further D-path?minimal
:与myers
相同,但没有进行一些修改,以便在分而治之的除法部分开始时速度更快,而不是更最小由于编辑脚本太长而表现不佳。从某种意义上来说,这才是真正的Myers算法。耐心
:Bram Cohen 算法;请参阅 Where can I find the diff algorithm? 已接受的答案直方图
:对耐心
的修改,旨在不意外地同步诸如仅大括号的线之类的东西。
它还可以运行您选择的外部差异引擎。
1或者至少是它想要比较的那些。如果您正在比较实际上不在提交中的文件,它们可能已经被提取。
2Git 主要在内存中执行此操作,但在运行外部差异时,确实使用临时文件。
关于git - git diff 如何判断一行是否已被修改或添加?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59613900/