GNU_linux编程指南读书笔记7--比较和合并源代码

diff命令是一组用来比较文件的命中中的一个。其他相关的命令包括cmp、wdiff3和sdiff

1 diff命令比较两个不同的文件或不同目录下的两个同名文件。
diff [options] srcfile dstfile
diff的比较行为和格式是由options空值得,diff在两个文件间进行一行一行的比较。
diff能够产生几种输出格式:
正规normal  默认的格式
上下文 context
同一 unified
并排 side-by-side

1)正规块格式如下:
change_command
< srcfile line
>dstfile line
change_command的格式如下:首先是一个来自srcfile的行号或以逗号隔开的行号范围,然后是一个命令符,接下来是一个来自destfile的行号或以逗号隔开的行号范围。
a-添加
b-删除
c-更改

2)并排输出格式
它吧srcfile和dstfile的内容并排显示在屏幕上。
diff -y
-W 指定输出列的宽度

>:表示该行在dstfile但不在srcfile里
<:表示该行在srcfile而不在dstfile里
|:标记出两个文件不相同的行

3)上下文输出格式
diff产生的上现文或统一的块格式是创建不定所采用的格式。
diff -c或者-C[num]
-c在显示每个有差别的行时同时还显示改行上下3行内容
-C[num]显示改行上下num行的内容

上下文块的格式采用一下一般形式:
*** srcfile srcfile_timestamp
--- dstfile dstfile_timestamp
************************
***srcfile_line_range***
srcfile line
srcfile line
---dstfile_line_range---
dstfile line
dstfile line
开头两行表明了作比较的文件
第三行把标识信息同其余的输出内容分隔开来

输出的其余部分由一个或多个块所组成,每个块举出一个文件有差别的地方,并且带有3行上下文。上下文行以两个空格开头,而有差别的行以一个表示差异类型的符号开头,后跟一个空格
+ 向srcfile添加一行以创建dstfile
-从srcfile删除一行以创建dstfile
!在srcfile改变一行以创建dstfile

4)统一格式
统一格式是对上下文格式的修改版本,它不显示重复的上下文而且还用其他办法压缩输出内容
---srcfile srcfile_timestamp

@@srcfile_range desfile_range@@
line_from_either_file
line_from_either_file...

以@@开头的没一行都标志一个块的开始。在块中,上下文行以空格开头,而有差别的行以+或—开头,以表示相对于srcfile在此位置上添加或删除一行。可以使用-U改变上下文行数。

2 比较二进制文件
将二进制文件的名字作为参数传递给diff
diff hello howdydif
Binary files hello and howdy differ

要显示有差别的行,使用-a选项
diff -a hello howdy>diffs

要查看两个文本文件是否不同但又不显示差别之处,可以使用-q选项
diff -q hello.c howdy.c
Files hello.c and howdy.c differ

diff -u -I include hello.c howdy.c
用-I regexp忽略同正则表达式regexp想匹配的插入或删除行

-b选项让diff忽略输入文件中空白数量的变化;-B让diff忽略删除或插入空行的改动
-w在逐行比较时忽略空白的变化

-b忽略的是输入文件之间空白数量上的变化
-w忽略在原来没有空白的地方添加空白

二 理解diff3命令

diff3 比较两个人作出的两套修改内容,创建第3个文件保存合并后的输出结果,并且指出双方修改的冲突之处。
diff3 [options] myfile oldfile yourfile

若某些行在3个输入文件中都不相同,则包含这些行的hunk被称为3路hunk
使用2路hunk表示只在两个文件中有差别的行

3路hunk用“===”标识,而2路hunk则在“===”后加上1、2或3来指出引起不同的那些文件。


三 准备源代码补丁

1 创建补丁
使用diff创建补丁时,要在命令行指定输出格式为上下文或统一diff,并且在diff命令行中按老文件先于新文件的顺序输入文件名,输出文件名的后缀应当是.diff或.patch
例如,在根据sigrot.1和 sigrot.2来生成补丁时,可以用如下命令行声称一个上下文格式的diff
diff -c sigrot.1 sigrout.2>sigrot.patch
diff -u sigrot.1 sigrout.1 sigrout.2>sigrout.patch

在需要遍历目录树的时候应该加上-r选项

2 应用补丁
patch -p0<sigrot.patch

-pnum选项指定使用补丁前补丁中所包含的文件名中需要剥离的"/"的重数,例如,如果补丁中的文件名是/home/kwall/src/sigrot/sigrot.1 则-p1的结果是home/kwall/src/sigrol/sigrot.1
-p4的结果是sigrout/sigrot.1
-p则剥去了除最终文件名之外的所有部分

如果在安装补丁后发现错误,只要简单的在原命令行中加上-R选项后再安装一次该补丁就能得到原来的文件
patch -p0 -R <sigrot.patch

你可能感兴趣的:(linux)