diff的輸出格式分爲傳統格式和統一格式
1)diff的傳統格式輸出.
############################################
cat before.txt
輸出:
This is a line to be deleted
This is a line that will be changed
This is a line that will be unchanged
cat after.txt
輸出:
This is a line that has been changed
This is a line that will be unchanged
This is a line that has been added
############################################
diff before.txt after.txt
輸 出:
1,2c1
< This is a line to be deleted
< This is a line that will be changed
---
> This is a line that has been changed
3a3
> This is a line that has been added
############################################
註釋:
傳統格式的輸出
1,2c1是指替換第1個文件的第1,2行到第2個文件的第2行,這裏的1,2是指第1個文件的第1,2行,c是替換的意思,最後的1是第2個文件的第1行
<號是指第1個文件更改或刪除的行
---號是分割兩個文件
>號是第2個文件中增加或刪除的行
3a3是指將第2個文件的第3行插入到第一個文件的第3行
也就是說第1個文件的:
< This is a line to be deleted
< This is a line that will be changed
被替換成第2個文件的:
> This is a line that has been changed
由於第1個文件的第3行和第2個文件的第2行一致,所以不做修改.
由於第2個文件的第3行是第1個文件所不具有的,所以在第1個文件的最後一行增加:
> This is a line that has been added2)patch命令的應用
用diff的傳統格式輸出:
#################################
diff before.txt after.txt >mypatch.txt
#################################
用patch修補before.txt文件,使before.txt和after.txt一致.
#################################
cat mypatch.txt |patch before.txt
輸出:
patching file before.txt
#################################
比較兩個文件,現在是一致的了.
#################################
cmp before.txt after.txt
#################################
用patch命令恢復before.txt.
#################################
patch -R before.txt <mypatch.txt
輸出:
patching file before.txt
#################################
注:-R標記告訴patch在反向上應用區別或者撤銷patch.
再比較兩個文件,現在不一致了.
#################################
cmp before.txt after.txt
輸出:
before.txt after.txt differ: byte 17, line 1
#################################
3)diff的統一格式輸出. ################################# diff -u before.txt after.txt |tee mypatch.diff 輸出: --- before.txt 2009-06-20 05:21:49.000000000 +0800 +++ after.txt 2009-06-20 04:03:16.000000000 +0800 @@ -1,3 +1,3 @@ -This is a line to be deleted -This is a line that will be changed +This is a line that has been changed This is a line that will be unchanged +This is a line that has been added ################################# 註釋: diff -u選項是統一格式輸出. --- before.txt 2009-06-20 05:21:49.000000000 +0800 --- before.txt是指舊文件 +++ after.txt 2009-06-20 04:03:16.000000000 +0800 +++ after.txt是指新文件. @@ -1,3 +1,3 @@ @@ -1,3是指第1個文件一共有3行,+1,3 @@是指第2個文件一共有3行. -This is a line to be deleted -This is a line that will be changed 是被刪除的行 +This is a line that has been changed 是增加的行 This is a line that will be unchanged 沒有-號和+號是指該行不變,因爲after.txt和before.txt都有這行. +This is a line that has been added 是增加的行 diff的統一格式比較與輸出是按順序進行的. 4)diff命令在目錄中的應用. 新建old和new目錄,old目錄包含了初始內容,new目錄包含文件的最新版本. ########################################## mkdir old new echo "This is one. It's unchanged." | tee old/one new/one echo "This is two. It will change." > old/two echo "This is two. It changed.">new/two echo "This is three. It's new" > new/three ########################################## 創建修補文件 ########################################## diff -Nur old/ new/ >mypatch.diff ########################################## 注:-r選項按照文件目錄遞歸創建修補文件. -u還是統一模式 -N是指當diff遇到一個只存在於兩個樹中的一個樹中的文件時,默認情況下跳過文件並且打印一個警告到stderr. 這個行爲可以通過-N選項來更改,這也導致了diff認爲丟失的文件實際上是存在的,但它是空的.採用這種方式, 一個修補文件可以包括已經創建的文件.然後應用修補程序創建新的文件. ########################################## more mypatch.diff 輸出: diff -Nur old/three new/three --- old/three 1970-01-01 08:00:00.000000000 +0800 +++ new/three 2009-06-20 06:55:34.000000000 +0800 @@ -0,0 +1 @@ +This is three. It's new diff -Nur old/two new/two --- old/two 2009-06-20 06:55:08.000000000 +0800 +++ new/two 2009-06-20 06:55:21.000000000 +0800 @@ -1 +1 @@ -This is two. It will change. +This is two. It changed. ########################################## 註釋: diff -Nur old/three new/three是指下面比較old/three new/three兩個文件. 因爲沒有old/three文件,所以在old/three中增加+This is three. It's new diff -Nur old/two new/two是指下面比較old/two new/two兩個文件 因爲old/two與new/two的第3行不一致,所以刪除This is two. It will change.增加This is two. It changed. 打補丁到old目錄,新建old/three以及更改old/two ########################################## patch --dir old< mypatch.diff ls -l old/ 輸出: one three two ########################################## 恢復old目錄的內容,包括刪除old/three,以及恢復old/two文件 ########################################## patch --dir old -R <mypatch.diff 輸出: ls -l old/ one two ########################################## 5)檢查和合並更改 用vim突出顯示單個字符的更改來表示區別. ########################################## vim -d after.txt before.txt ########################################## 用gui工具gvimdiff來顯示兩個文件. ########################################## gvimdiff after.txt before.txt ########################################## 新建文件orig.c ########################################## vi orig.c void foo(void) { printf("This will be changed by me. n"); printf("This will be unchanged,n"); printf("This will be changed by you.n"); } ########################################## 複製文件orig.c到me.c,更改第4行爲printf("This was changed by me. n"); ########################################## vi me.c void foo(void) { printf("This was changed by me. n"); printf("This will be unchanged,n"); printf("This will be changed by you.n"); } ########################################## 複製文件orig.c到you.c,更改第7行爲printf("This was changed by you.n"); ########################################## vi you.c void foo(void) { printf("This will be changed by me. n"); printf("This will be unchanged,n"); printf("This was changed by you.n"); } ########################################## |
版本工具如cvs,subversion使用GNU合併工具稱爲diff3. ########################################## diff3 me.c orig.c you.c 輸出: ====1 1:3c printf("This was changed by me. n"); 2:3c 3:3c printf("This will be changed by me. n"); ====3 1:7c 2:7c printf("This will be changed by you.n"); 3:7c printf("This was changed by you.n"); 注: 在沒有參數的情況下,diff3產生的輸出說明了那行更改. ====1和====3指明造成同原始文件不同的是哪一個修改文件. 編號方式基於參數序列. 也就是第1個文件和第3個文件與原文件不同. 1:3c printf("This was changed by me. n"); 3:3c printf("This will be changed by me. n"); 1:3c表示第1個文件的第3行與3:3c表示的第3個文件的第3行不同. 爲什麼不顯示與原文件的比較呢。因爲第3個文件的第3行與源文件(第2個文件)相同.所以與哪個文件比較無所謂了. 2:7c printf("This will be changed by you.n"); 3:7c printf("This was changed by you.n"); 2:7c表示第2個文件的第7行與3:7c表示的第3個文件的第7行不同. diff3會試圖爲我們進行合併.合併是在源文件的基礎上,依據兩個新文件進行修改 源文件是第二個文件,第一個文件和第三個文件可以互換,但他們必須有共同的祖先,就是第二個文件. ####################################### diff3 -m me.c orig.c you.c |cat -n 輸出: 1 void foo(void) 2 { 3 printf("This was changed by me. n"); 4 5 printf("This will be unchanged,n"); 6 7 printf("This was changed by you.n"); 8 } ########################################爲了測試更復雜的環境,新建一個文件orig.c.1 內容如下: ######################################## vi orig.c.1 void foo(void) { printf("This will be changed by both of us.n"); } ######################################## 用diff3 -m再次比較輸出,如下: ######################################## diff3 -m me.c orig.c.1 you.c void foo(void) { <<<<<<< me.c printf("This was changed by me. n"); printf("This will be unchanged,n"); printf("This will be changed by you.n"); ||||||| orig.c.1 printf("This will be changed by both of us.n"); ======= printf("This will be changed by me. n"); printf("This will be unchanged,n"); printf("This was changed by you.n"); >>>>>>> you.c } ######################################## 註釋:以上的格式,同cvs update,需要人工合併文件的格式是一致的. |
====
http://www.xxlinux.com/linux/article/accidence/com/2010-03-26/18137_3.html