SYNOPSIS
diff [OPTION]... FILES
FILES一般为<old file> <new file>
DESCRIPTION
https://manpages.debian.org/buster/diffutils/diff.1.en.html
Normal diff(普通模式)
最早的Unix(即AT&T版本的Unix),使用的就是这种格式的diff。
$ diff f1 f2
4c4
< a
---
> b
分析:
a
表示addition,d
表示deletion,c
表示change4c4
表示old file(f1)的第4行change为new file(f2)的第四行<
表示删除,>
表示增加,---
表示分割old file与new file的改动显示
Context diff(上下文格式)
上个世纪80年代初,加州大学伯克利分校推出BSD版本的Unix时,觉得diff的显示结果太简单,最好加入上下文,便于了解发生的变动。因此,推出了上下文格式的diff。
它的使用方法是加入c参数(代表context)。
❯ diff -c f1 f2
*** f1 2020-06-05 10:56:20.728913835 +0800
--- f2 2020-06-05 10:56:39.480910387 +0800
***************
*** 13,19 ****
a
a
a
! a
a
a
a
--- 13,19 ----
a
a
a
! b
a
a
a
分析:
***
表示变动前的文件,---
表示变动后的文件。2020-06-05 10:56:20.728913835 +0800
表示最后修改日期与修改时间,+0800
是中国的北京时间*** 13,19 ****
表示变动前的文件的第13行到第19行。- 每行前有标志位,如果为空,表示该行无变化;若是
!
,表示该行有改动;若是-
,表示该行被删除;若是+
,表示该行为新增。除了变动行(第4行)以外,也是上下文各显示三行,总共显示7行
Unified diff(合并格式)
如果两个文件相似度很高,那么上下文格式的diff,将显示大量重复的内容,很浪费空间。1990年,GNU diff率先推出了"合并格式"的diff,将f1和f2的上下文合并在一起显示。
❯ diff -u f1 f2
--- f1 2020-06-05 10:56:20.728913835 +0800
+++ f2 2020-06-05 10:56:39.480910387 +0800
@@ -13,7 +13,7 @@
a
a
a
-a
+b
a
a
a
分析:
- 在
@@ -13,7 +13,7 @@
中,-
表示第一个文件(即f1),"13"表示第13行,“7"表示连续7行。合在一起,就表示下面是第一个文件从第1行开始的连续7行。同样的,”+13,7"表示变动后,成为第二个文件从第13行开始的连续7行 - 每一行最前面的标志位,空表示无变动,
-
表示第一个文件删除的行,+
表示第二个文件新增的行。
git格式的diff
版本管理系统git,使用的是合并格式diff的变体。
diff --git a/f1 b/f1
index 6f8a38c..449b072 100644
--- a/f1
+++ b/f1
@@ -1,7 +1,7 @@
a
a
a
-a
+b
a
a
a
分析:
diff --git a/f1 b/f1
表示结果为git格式的diffindex 6f8a38c..449b072 100644
表示两个版本的git哈希值(暂存区的6f8a38c对象,与工作区的449b072对象进行比较),最后的六位数字是对象的模式(普通文件,644权限)。---
表示变动前的版本,+++
表示变动后的版本。- 在
@@ -1,7 +1,7 @@
中,-
表示第一个文件(即f1),"1"表示第1行,“7"表示连续7行。合在一起,就表示下面是第一个文件从第1行开始的连续7行。同样的,”+1,7"表示变动后,成为第二个文件从第1行开始的连续7行 - 每一行最前面的标志位,空表示无变动,
-
表示第一个文件删除的行,+
表示第二个文件新增的行。
参考
http://www.ruanyifeng.com/blog/2012/08/how_to_read_diff.html
https://manpages.debian.org/buster/diffutils/diff.1.en.html