git diff与linux diff的输出格式之unified format
前言
前面有一篇文章《一个有些意思的项目--文件夹对比工具(一)》,里面简单讲了下diff算法之--Myers算法。
既然是算法,就会有实现,比如git diff中有Myers的实现,git diff默认就是用了这个算法(也可以选择其他算法);这个Myers算法,在linux的diff工具中也有实现;或者在一些js库、java库等都有实现。
另外,既然是算法,那就有输入和输出,如果大家都正确实现的话,按理说输出格式也是能达成统一的。
接下来我们就看一下在各个软件中的输出格式。
git diff 输出格式
样例文件
附原文件内容,有兴趣可以跟着试试。
11111111111111112222222333333333333333444444444444444444455555555555666666666
111111111111111122222223333333333333334444444448878784444444444insert155555555555insert2666666666insert3
输出格式
之前我以为只能在版本间对比文件差异,原来文件也是可以直接对比的,如下:
git diff test.txt test2.txt
这里可以看到,输出中还包含了一些两侧没变动的行,这是怎么回事呢?主要是,默认情况下,会输出差异行的上下文(即差异行的前面几行和后面几行,默认是三行)。
为了方便我们对比差异,我们先开启一个选项,不展示上下文。
“
-U
--unified=
Generate diffs with lines of context instead of the usual three. Implies
--patch
.”
开启这个选项后,输出如下:
我们看的里面有很多奇怪的符号,看得似懂非懂的,还有一些数字,也不知道啥意思,我们暂且不表,接下来,看看linux diff工具的输出。
linux diff输出格式
样例文件
同上。
输出格式(-U选项)
-U选项,在linux diff文档里,是这个意思,我们指定 -U 0,就是0行上下文。
“
-u, -U NUM, --unified[=NUM]output NUM (default 3) lines of unified context
”
看起来,格式差不太多哈,不过内容不太一样,这个先不用管,大家虽然都是同一个算法,但是部分工具会使用该算法的变体,所以输出有些不同也是正常。
先聚焦于输出格式即可。
默认输出格式(不带各类选项)
看起来有点奇怪,输出都没有那些@@符号了,好像格式不同了,这是咋回事。
输出格式(-c选项)
其实还有个选项,如下:
“
-c, -C NUM, --context[=NUM]output NUM (default 3) lines of copied context
”
这个看起来像是上下文之类的,我们测试下:
看上去和默认格式、-U格式都不同。
linux diff输出的两种格式(官方文档)
具体内容都是来自于官方文档:https://www.gnu.org/software/diffutils/manual/html_node/index.html
这里提到了两种格式:
Context Format,即-c选项时,这种对比文件时,感觉不是很直观;主要的场景是,用diff来生成代码补丁,代码差异行上下有上下文,方便补丁程序patch来进行差异代码定位。
“
The context output format shows several lines of context around the lines that differ. It is the standard format for distributing updates to source code.
”
Unified Format,即-u选项时,这种对比文件时,感觉还比较方便看;官方定义如下:
“
The unified output format is a variation on the context format that is more compact because it omits redundant context lines.
”
即该格式是context format的变体,因为省略了冗余的上下文行,显得更加紧凑。
unified format格式
简介
不知道大家发现没,git diff和linux diff(-u)时,产生的格式是一样的,即unified format。
为什么单独讲这个格式呢,因为我发现,有很多文件差异相关的第三方库,不管是js、java啥的,产生的格式都是unified format。
而且,js中还有一个很广泛的库diff2html,是可以接收unified format格式的文件为输入,渲染为美观大方的html组件。
所以,在软件生态来说,该格式已经是一个相对通用的交互格式了,类似于json、xml这样的标准格式,所以,我们就讲解它。
详解
以如下输出来举例:
unified format一开始就是文件列表,就是上图的:
--- a/test.txt+++ b/test2.txt
接下来就是差异段列表了,上图一共两个差异段,有点看不懂?那我们再看看样例文件在beyond compare中的对比效果。
以如下差异段来说:
@@ -4 +4,2 @@-4444444444444444444+4444444448878784444444444+insert1
@@ 这一行,表示一个汇总信息,其中的-4,其实应该是-4,1。 "-"代表文件--- a/test.txt
,4代表第四行,test.txt的第4行,就是4444444444444444444
这一行,被省略的1,表示展示的text.txt从第4行开始的行的数量。
比如,4,2表示展示第4、5行,4,3表示展示第4、5、6行。
+4,2同理,"+"代表文件+++ a/test2.txt
,也就是展示4开头的两行,即第4、5行。
大家再看看这个图,不知道是不是可以理解了:
另外,@@是header行,算是一个汇总信息,就像是一个协议包的包头一样,说明包的内容的长度等,或者像是http里的content-length字段。
接下来,就是具体的内容,
@@ -4 +4,2 @@-4444444444444444444+4444444448878784444444444+insert1
比如,-4444444444444444444
的“-”不仅表示属于文件text.txt
,还表示这行是要被删除的。“+”也是同理,表示是要新增的行。
还有一种情况是,两边行相等(比如需要展示上下文的时候),这种时候的话,前缀就是一个空字符,“ ”。
具体看下面:
https://www.gnu.org/software/diffutils/manual/html_node/Detailed-Unified.html
扩展资料:
https://en.wikipedia.org/wiki/Diff#:~:text=The%20unified%20format%20 (要科学上网)
diff2html渲染unified format
之前提到unified format就是个中间格式,只要大家都按这个格式来,生态就建立起来了。
接下来,我们就把前面那个字符串用一个js库:diff2html来渲染一下,看看效果。
先在js中定义个字面量diffString,再用diff2html这个js库来渲染:
const diffString = `--- a/test.txt+++ b/test2.txt@@ -4 +4,2 @@-4444444444444444444+4444444448878784444444444+insert1@@ -6 +7,3 @@-666666666\ No newline at end of file+insert2+666666666+insert3`;
document.addEventListener('DOMContentLoaded', function () { const targetElement = document.getElementById('filesExistInBothDir'); const configuration = { // 渲染文件列表 drawFileList: true, // 文件列表显示/隐藏的开关 fileListToggle: false, // 默认展示文件列表 fileListStartVisible: false, // 文件内容可收起/展开的开关 fileContentToggle: true, matching: 'lines', // 左右两侧双栏展示 outputFormat: 'side-by-side', // 双栏展示模式时,拖动左边的横向滚动条,右侧同步滚动 synchronisedScroll: true, // 高亮代码 highlight: true, renderNothingWhenEmpty: true, }; const diff2htmlUi = new Diff2HtmlUI(targetElement, diffString, configuration); diff2htmlUi.draw(); diff2htmlUi.highlightCode();
效果如下:
html源文件上传了,感兴趣可以看看:
https://dump-1252523945.cos.ap-shanghai.myqcloud.com/img/compare-result-162513.html
本文由 mdnice 多平台发布
git diff与linux diff的输出格式之unified format相关推荐
- Linux Diff命令用法
Diff命令 Linux diff命令用于比较文件的差异. diff以逐行的方式,比较文本文件的异同处.如果指定要比较目录,则diff会比较目录中相同文件名的文件,但不会比较其中子目录. 语法: di ...
- Linux diff命令详解
diff(difference)命令常用来比较两个文件中的内容.diff 命令在最简单的情况下,比较两个文件的不同.如果使用"-"代替"文件"参数,则要比较的内 ...
- git apply、git am打补丁.diff 和 .patch
前提: 生成patch: git format-patch -M master 生成指定patch,0163bed3bf59ae74c36cc5138b4c24f1556d8304是commit id ...
- linux diff命令_Linux diff命令示例
linux diff命令 The Linux diff command analyses a file line by line and gives an output of a list of ch ...
- Git 2.19 对Diff、Branch和Grep等做了改进
\Git的最新版带来了丰富的新功能以及内部更新,包括改进的diff.branch和grep,更好的命令行补全,新的range-diff命令等.\\Git diff现在可以正确地标记以intent-to ...
- Linux: 举例说明Linux diff 命令
在比较文件的时候,通常会用基于GUI的软件.很少有人真正会为了这个目的使用命 令行工具.虽然说使用命令行来比较文件/目录并不像一件小事儿那样容易,但是如果你是一个Linux使用者,那么我想你应该知道如 ...
- [git] 基础操作-01-diff / diff head 版本比较 - 非常的详细讨论版本比较中的各种符号的意思,以及如何在git中进行版本比较
前言: 本文讨论,各个处理逻辑中版本的表述.比较中,git的操作的细节和表述符合的具体意义:(非常细节,会的朋友可以跳过) 对于 遇到的各个命令,会给出详细的解释在附录里面: 理解git文档的四个状态 ...
- linux diff详解
diff是Unix系统的一个很重要的工具程序. 它用来比较两个文本文件的差异,是代码版本管理的基石之一.你在命令行下,输入: $ diff <变动前的文件> <变动后的文件> ...
- Git导出差分(diff)包--before/after/patch
*完全由本人原创,转载请注明出处哦~ http://blog.csdn.net/adrianjian/article/details/44085181* 差分包是什么? 即修正前后的差异.包含修正前. ...
最新文章
- Matplotlib基础(part2)--图形对象
- 详解MTK系统中字符转换问题
- spring中@Inject和@Autowired的区别?分别在什么条件下使用呢?
- 【OpenCV 例程200篇】23. 图像添加中文文字
- 船员英语老师是面试还是计算机答题,面试时的英语介绍
- 最新试客联盟JS逆向分析
- Linux常用软件包管理器命令
- 在 Linux 中如何删除分区
- SYN重要知识点总结
- 2cm有多长实物图_两厘米(2cm有多长实物图)
- SQL 多个字段的值拼接成Josn
- Ubuntu16.04开启SSH服务
- 一张图读懂一个产业短视频第4期
- 【图像分类】Deep Layer Aggregation论文理解
- java面试(3)SQL优化
- 移动应用遗留系统重构(1)- 开篇
- python零基础入门最简洁版
- jsp+ssm计算机毕业设计亿上汽车在线销售管理系统【附源码】
- CKEditor5 集成 Vue
- Linux中使用rz命令和sz命令传输文件
热门文章
- “由于无法验证发行者,所以WINDOWS已经阻止此软件”的解决方法
- 微信小程序分享生成海报
- iOS 手机安装Charles证书失败解决方法
- 们指点如果在android平台下开启jbox2d的debugDraw功能
- LINUX MMC 子系统分析之五 MMC driver模块分析
- Linux系统中read的用法,Linux系统中read的使用技巧
- android 判断安装微信,Android开发中判断手机是否安装了QQ或者微信
- 国外开源IoT平台Thingsboard社区版本(V3.3.2)在Win10环境下进行源码编译及运行指南
- 嵌入式系统设计(三):Vim编辑器的学习
- 用 Mindjet MindManager 管理自己的思维