海門做網(wǎng)站自動(dòng)優(yōu)化句子的軟件
????????diff是Unix系統(tǒng)的一個(gè)很重要的工具程序。
????????它用來(lái)比較兩個(gè)文本文件的差異,是代碼版本管理的基石之一。你在命令行下,輸入:
$ diff < 變動(dòng)前的文件 > < 變動(dòng)后的文件 >;
diff就會(huì)告訴你,這兩個(gè)文件有何差異。它的顯示結(jié)果不太好懂,下面我就來(lái)說(shuō)明,如何讀懂diff。
一、diff的三種格式
由于歷史原因,diff有三種格式:
* 正常格式(normal diff)
* 上下文格式(context diff)
* 合并格式(unified diff)
我們依次來(lái)看。
二、示例文件
為了便于講解,先新建兩個(gè)示例文件。
第一個(gè)文件叫做f1,內(nèi)容是每行一個(gè)a,一共7行。
aaaaaaa
第二個(gè)文件叫做f2,修改f1而成,第4行變成b,其他不變。
aaabaaa
三、正常格式的diff
現(xiàn)在對(duì)f1和f2進(jìn)行比較:
$
diff
? ? f1 ? f2
這時(shí),diff就會(huì)顯示正常格式的結(jié)果:
4c4< a — > b
第一行是一個(gè)提示,用來(lái)說(shuō)明變動(dòng)位置。
4c4
它分成三個(gè)部分:前面的”4″,表示f1的第4行有變化;中間的”c”表示變動(dòng)的模式是內(nèi)容改變(change),其他模式還有”增加”(a,代表addition)和”刪除”(d,代表deletion);后面的”4″,表示變動(dòng)后變成f2的第4行。
第二行分成兩個(gè)部分。
< a
前面的小于號(hào),表示要從f1當(dāng)中去除該行(也就是第4行),后面的”a”表示該行的內(nèi)容。 第三行用來(lái)分割f1和f2。
—
第四行,類似于第二行。
> b
前面的大于號(hào)表示f2增加了該行,后面的”b”表示該行的內(nèi)容。
最早的Unix(即AT&T版本的Unix),使用的就是這種格式的diff。
四、上下文格式的diff
????????上個(gè)世紀(jì)80年代初,加州大學(xué)伯克利分校推出BSD版本的Unix時(shí),覺(jué)得diff的顯示結(jié)果太簡(jiǎn)單,最好加入上下文,便于了解發(fā)生的變動(dòng)。因此,推出了上下文格式的diff。
它的使用方法是加入c參數(shù)(代表context)。
$ diff -c f1 f2
顯示結(jié)果如下:
*** f1 2012-08-29 16:45:41.000000000 +0800— f2 2012-08-29 16:45:51.000000000 +0800****************** 1,7 ****aaa!aaaa— 1,7 —-aaa!baaa
這個(gè)結(jié)果分成四個(gè)部分。
第一部分的兩行,顯示兩個(gè)文件的基本情況:文件名和時(shí)間信息。
*** f1 2012-08-29 16:45:41.000000000 +0800
— f2 2012-08-29 16:45:51.000000000 +0800
“***”表示變動(dòng)前的文件,”—”表示變動(dòng)后的文件。
第二部分是15個(gè)星號(hào),將文件的基本情況與變動(dòng)內(nèi)容分割開(kāi)。
***************
第三部分顯示變動(dòng)前的文件,即f1。
*** 1,7 ****aaa!aaaa
這時(shí)不僅顯示發(fā)生變化的第4行,還顯示第4行的前面三行和后面三行,因此一共顯示7行。所以,前面的”*** 1,7 ****”就表示,從第1行開(kāi)始連續(xù)7行。
另外,文件內(nèi)容的每一行最前面,還有一個(gè)標(biāo)記位。如果為空,表示該行無(wú)變化;如果是感嘆號(hào)(!),表示該行有改動(dòng);如果是減號(hào)(-),表示該行被刪除;如果是加號(hào)(+),表示該行為新增。
第四部分顯示變動(dòng)后的文件,即f2。
— 1,7 —-aaa!baaa
除了變動(dòng)行(第4行)以外,也是上下文各顯示三行,總共顯示7行。
五、合并格式的diff
如果兩個(gè)文件相似度很高,那么上下文格式的diff,將顯示大量重復(fù)的內(nèi)容,很浪費(fèi)空間。1990年,GNU?diff率先推出了”合并格式”的diff,將f1和f2的上下文合并在一起顯示。
它的使用方法是加入u參數(shù)(代表unified)。
$ diff -u f1 f2
顯示結(jié)果如下:
— f1 2012-08-29 16:45:41.000000000 +0800+++ f2 2012-08-29 16:45:51.000000000 +0800@@ -1,7 +1,7 @@aaa-a+baaa
它的第一部分,也是文件的基本信息。
— f1 2012-08-29 16:45:41.000000000 +0800
+++ f2 2012-08-29 16:45:51.000000000 +0800
“—”表示變動(dòng)前的文件,”+++”表示變動(dòng)后的文件。
第二部分,變動(dòng)的位置用兩個(gè)@作為起首和結(jié)束。
@@ -1,7 +1,7 @@
前面的”-1,7″分成三個(gè)部分:減號(hào)表示第一個(gè)文件(即f1),”1″表示第1行,”7″表示連續(xù)7行。合在一起,就表示下面是第一個(gè)文件從第1行開(kāi)始的連續(xù)7行。同樣的,”+1,7″表示變動(dòng)后,成為第二個(gè)文件從第1行開(kāi)始的連續(xù)7行。
第三部分是變動(dòng)的具體內(nèi)容。
aaa-a+baaa
除了有變動(dòng)的那些行以外,也是上下文各顯示3行。它將兩個(gè)文件的上下文,合并顯示在一起,所以叫做”合并格式”。每一行最前面的標(biāo)志位,空表示無(wú)變動(dòng),減號(hào)表示第一個(gè)文件刪除的行,加號(hào)表示第二個(gè)文件新增的行。
六、Git格式的diff
版本管理系統(tǒng)git,使用的是合并格式diff的變體。
$ git diff
顯示結(jié)果如下:
diff –git a/f1 b/f1index 6f8a38c..449b072 100644— a/f1+++ b/f1@@ -1,7 +1,7 @@aaa-a+baaa
第一行表示結(jié)果為git格式的diff。
1 |
|
進(jìn)行比較的是,a版本的f1(即變動(dòng)前)和b版本的f1(即變動(dòng)后)。
第二行表示兩個(gè)版本的git哈希值(index區(qū)域的6f8a38c對(duì)象,與工作目錄區(qū)域的449b072對(duì)象進(jìn)行比較),最后的六位數(shù)字是對(duì)象的模式(普通文件,644權(quán)限)。
index 6f8a38c..449b072 100644
第三行表示進(jìn)行比較的兩個(gè)文件。
— a/f1
+++ b/f1
“—”表示變動(dòng)前的版本,”+++”表示變動(dòng)后的版本。
后面的行都與官方的合并格式diff相同。
@@ -1,7 +1,7 @@aaa-a+baaa
七、閱讀材料
*?diff – Wikipedia
*?How to read a patch or diff
*?How to work with diff representation in git
(完)