Git diff/patch如何工作以及安全性如何?

Git diff/patch如何工作以及安全性如何?,git,diff,patch,levenshtein-distance,lcs,Git,Diff,Patch,Levenshtein Distance,Lcs,关于它们是如何工作的,我想知道一些低级的工作内容: 什么会触发合并冲突 工具是否也使用上下文来应用修补程序 他们如何处理实际上不修改源代码行为的更改?例如,交换函数定义位置 关于安全性,老实说,巨大的Linux内核存储库是它们安全性的证明。但我想知道以下几点: 对于用户应该知道的工具,是否有任何警告/限制 这些算法是否已被证明不会产生错误的结果 如果没有,是否有提出集成测试的实现/论文至少在经验上证明了它们是无错误的?类似于这些文件和文件的内容 同样,关于上一点,Linux存储库应该足够了,但我

关于它们是如何工作的,我想知道一些低级的工作内容:

  • 什么会触发合并冲突
  • 工具是否也使用上下文来应用修补程序
  • 他们如何处理实际上不修改源代码行为的更改?例如,交换函数定义位置 关于安全性,老实说,巨大的Linux内核存储库是它们安全性的证明。但我想知道以下几点:

  • 对于用户应该知道的工具,是否有任何警告/限制
  • 这些算法是否已被证明不会产生错误的结果
  • 如果没有,是否有提出集成测试的实现/论文至少在经验上证明了它们是无错误的?类似于这些文件和文件的内容
  • 同样,关于上一点,Linux存储库应该足够了,但我想知道一些更通用的东西。源代码即使更改,也不会有太大的更改(特别是由于实现的算法和语法限制),但是安全性可以推广到通用文本文件吗
  • 编辑 好的,各位,我正在编辑,因为问题是模糊的,答案并没有涉及细节

    Git/diff/patch详细信息 Git默认使用的统一diff格式基本上输出三个内容:更改、更改周围的上下文以及与上下文相关的行号。这些东西中的每一个都可能同时被更改,也可能没有被同时更改,所以Git基本上必须处理8种可能的情况

    例如,如果在上下文之前添加或删除了行,则行号将不同;但是如果上下文和更改仍然相同,那么diff可以使用上下文本身来对齐文本并应用补丁(我不知道这是否确实发生)。那么,在其他情况下会发生什么?我想知道Git如何决定自动应用更改,以及何时决定发出错误并让用户解决冲突的详细信息

    可靠性 我非常确定Git是完全可靠的,因为它确实有提交的完整历史记录,并且可以遍历历史记录。我想要的是一些关于这方面的学术研究和参考资料,如果它们存在的话

    我们知道Git/diff将文件视为通用文本文件,并以行方式工作,这与这个主题仍然有点相关。此外,diff采用的LCS算法将生成一个补丁,以尽量减少更改的数量

    以下是我也想知道的一些事情:

  • 为什么使用LCS代替其他字符串度量算法
  • 如果使用了LCS,为什么不使用修改后的度量,并考虑基础语言的语法方面
  • 如果使用这样一个考虑到语法方面的指标,它们能带来好处吗?在这种情况下,好处可以是任何东西,例如,更干净的“责备日志”
  • 同样,这些可能是巨大的话题,欢迎发表学术文章

    什么会触发合并冲突

    让我们先看看最简单的git,递归的:当合并两个分支时,比如说ab,它们有一个共同的祖先c,git创建一个补丁,从commitc转到a头部的commit ad,并尝试将该补丁应用于b头部的树。如果补丁失败,那就是合并冲突

    git默认使用递归策略,即。一般的想法是一样的:如果链接中描述的3路合并算法由于来自不同分支的两个提交更改了相同的行而失败,那么这就是合并冲突

    工具是否也使用上下文来应用修补程序

    对。如果修补程序未应用于diff文件中存储的精确行号,则修补程序会根据上下文在与原始行相邻的几行中查找正确的行

    他们如何处理实际上不修改源代码行为的更改?例如,交换函数定义位置

    补丁是不智能的,它无法区分这些变化。它将移动的函数视为一对添加的行和一对删除的行。如果一个分支上的提交更改了一个函数,而另一个分支上的提交未更改地移动了该函数,那么尝试合并总是会导致合并冲突

    对于用户应该知道的工具,是否有任何警告/限制

    至于patch和diff:没有。它们都使用自20世纪70年代初以来就存在的算法,并且非常健壮。只要他们不抱怨,你就可以相当肯定他们做了你想做的事

    这就是说:
    gitmerge
    试图自行解决合并冲突。在一些罕见的情况下,这里可能会出问题——有一个例子即将结束

    这些算法是否已被证明不会产生错误的结果? 如果没有,是否有提出集成测试的实现/论文至少在经验上证明了它们是无错误的

    在这种情况下,“错误的结果”是一个相当不具体的术语;我认为这是无法证明的。经验证明,将
    diff a b
    生成的补丁应用于文件
    a
    在任何情况下都会生成文件
    b

    源代码即使更改,也不会有太大的更改(特别是由于实现的算法和语法限制),但是安全性可以推广到通用文本文件吗

    同样,diff/patch/git并不区分源代码和其他文本文件。git在通用文本文件上的效果和在源代码上的效果一样好

    我非常确定Git是完全可靠的,因为它确实有完整的 提交的历史记录,可以遍历历史记录。我想要一些 指向acade的指针
    [PatchPlan version 0.1]------------------------------------
    * Description   : 
    * Old Version   :
    * New Version   :
    * URL       :
    * Patch made by : 
    * Comments  :
    * Used tools    :
    -----------------------------------------------------------
    [C ] ... "dir1/dir2/filename.ext" MD5
             N:"dir3/dir4/newfile.ext" MD5
    [C ] ... "dir1/dir3/filename.ext" MD5
             P:"dir1/dir3/patchfile.ext.patch" TYPE MD5
    [D ] ... "dir1/dir2/filename.ext" MD5
    [A ] ... "dir1/dir2/filename.ext"
             N:"dir3/dir4/newfile.ext" MD5
    [AD] ... "dir1/dir2/newdirname"
    -----------------------------------------------------------
    
    [C ] ... - Status field
    
             C  - Changed
             D  - Deleted
             A  - Added
             DE - Deleted empty directory
             DD - Deleted directory
             AD - Added directory
             ... - place reserved for flags like overwrite,
                   force deletion etc. flags are separated by
                   spaces from other fields
    
    
    
    
    "dir1/dir2/filename.ext" - relative path of patched file
    
    
    MD5    - 32 letters, i.e. cb5bc9f48388568178f24e6294ea782b
    
    
    N:"dir3/dir4/newfile.ext" MD5
           - path for replacement file relative to directory
             with new files, i.e. temp directory where they
             were extracted, for example
    
    P:"dir3/dir4/patchfile.ext.patch" TYPE MD5
           - path for patch file that should be applied
             TYPE is one of the supported 
             - VPATCH (DIFF, BSDIFF are planned)
           - .patch extensions is not a requirement, but
             merely a convention
           - MD5 in this case is MD5 of the new patched file
             and not of the patch itself
    
    
    [D ] ... - MD5 of the file to be deleted