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 added
2)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,需要人工合并文件的格式是一致的.