diff格式学习

文件比较是最常用的功能了,beyondcompare 一直在用,下面了解一下 git 里面的源码比较
有三种格式:
正常格式(normal diff)
上下文格式(context diff)
合并格式(unified diff)

比较文件

diff -y -W 50 -w --suppress-common-lines ./eostexas.abi ./eostexas.abibak

-W或--width 在使用-y参数时,指定栏宽。
--suppress-common-lines 在使用-y参数时,仅显示不同之处
-y或--side-by-side 以并列的方式显示文件的异同之处。

“|”表示前后2个文件内容有不同
“<”表示后面文件比前面文件少了1行内容
“>”表示后面文件比前面文件多了1行内容

比较文件夹

diff -Nrq a b

r 表示递归
q 只输出不一样的文件

GNU Diffutils

合并格式的 diff

现在都是这个格式的。 -u 表示 unified

diff -u f1 f2

变动的位置用两个@作为起首和结束。

@@ -1,7 +1,7 @@

前面的”-1,7”分成三个部分:减号表示第一个文件(即f1),”1”表示第1行,”7”表示连续7行。合在一起,就表示下面是第一个文件从第1行开始的连续7行。同样的,”+1,7”表示变动后,成为第二个文件从第1行开始的连续7行。

创建补丁

diff -ruaN oldfile newfile > patchfile.patch

-r: 递归遍历子目录
-u: 使用合并格式输出
-a: 将所有文件视为文本文件
-N: 将未出现的文件视为空文件(比较目录时有用)
oldfile及newfile可以是一个目录,配合-r参数使用就会递归比较这两个目录。

合并patch

-p1表示去掉第一层路径分隔符,即./,此时得到的old文件夹位于当前路径中,于是就可以正确的打补丁了。
不用 p1 会提示
can't find file to patch at input

patch -p1 < ./commit.diff