git - git diff 如何判断一行是否已被修改或添加?
问题描述
给定两个文件 git diff 或任何 diff 工具如何判断哪些行已添加、修改或删除?
是否存在无法识别已编辑行的正确状态的边缘情况?
编辑:这个问题更关心差异如何发生的实际方法
解决方案
Git 存储快照:给定您选择的任意两个快照,Git 提取您想要比较的文件1到临时区域2,然后在这两个文件上运行“差异引擎”。这个引擎的结果是或者应该是一系列指令,当应用这些指令时,会将左侧文件转换为右侧文件。
Git 有几个内置的差异引擎,Git 称之为:
myers
:这使用了Eugene W Myers 的算法,稍作修改。关于 Myers diff 有很多 StackOverflow 问题和答案:Myers diff algorithm vs Hunt–McIlroy algorithm;差异算法?(多个答案,但有几个关于迈尔斯差异的答案);Myers 的差异:为什么 V[k − 1] < V[k + 1] 保证选择更远的 D 路径?minimal
:myers
当分而治之的分割部分由于非常长的编辑脚本而开始表现不佳时,与但没有进行一些修改以更快而不是更小。从某种意义上说,这才是真正的迈尔斯算法。patience
: Bram Cohen 算法;查看接受的答案在哪里可以找到差异算法?histogram
: 的修改patience
旨在不会意外地同步仅大括号行之类的内容。
它还可以运行您选择的外部差异引擎。
1或者至少是它想要比较的那些。如果您正在比较实际上不在提交中的文件,它们可能已经被提取。
2 Git 主要在内存中执行此操作,但在运行外部差异时,确实使用临时文件。
推荐阅读
- numpy - 使用 `np.tensordot` 或仅二维 `np.dot` 获取 `np.dot` 的 ND 行为
- xquery - xquery大于等于功能不起作用
- mysql - Mysql:在 TRUNCATE 中使用 IF
- r - 使用 purrr 中的 map 提取以另一个变量为条件的值
- python - 如何在运行过程中停止while循环并返回开始?
- javascript - Node.js 与 socket.io 的连接不起作用
- c# - Visual Studio 2017下C#中的int[*]是什么意思
- python - 如何在 Open edX 中添加学生出勤率。
- c++ - 对数组排序——问题
- scala - 如何使用 Spark 不断更新 HDFS 目录并根据字符串(行)将输出拆分为多个 HDFS 文件?