patch典型地用於把一個目錄下的源代碼文件更新到新的版本,從而就避免了下載整個新的源代碼檔案的必要。
diff 和 patch 是相輔相成的, diff命令產生patch文件, 由patch命令解析執行。
先介紹diff
diff的功能就是用來比較兩個文件的不同,然後記錄下來,也就是所謂的diff補丁。
格式 : diff[參數][文件1或目錄1][文件2或目錄2]
參數 : 這裏只提幾個能和patch一起使用的
-a或--text diff預設只會逐行比較文本文件。
-N或--new-file 在比較目錄時,若文件A僅出現在某個目錄中,預設會顯示:Only in目錄:文件A若使用-N參數,則diff會將文件A與一個空白的文件比較。
-r或--recursive 比較子目錄中的文件。
-u,-U或--unified= 以合併的方式來顯示文件內容的不同。
-c 顯示全部內文,並標出不同之處。
一般就使用 -Nur
產生patch文件
命令diff A B >C ,一般A是原始文件,B是修改後的文件,C稱爲A的補丁文件。
不加任何參數生成的diff文件格式是一種簡單的格式,這種格式只標出了不一樣的行數和內容。我們需要一種更詳細的格式,可以標識出不同之處的上下文環境,這樣更有利於提高patch命令的識別能力。這個時候可以用-c開關。
patch 命令用於打補丁,補丁文件是使用diff產生的
patch就是利用diff製作的補丁來實現源文件(夾)和目的文件(夾)的轉換。這樣說就意味着你可以有源文件(夾)――>目的文件(夾),也可以目的文件(夾)――>源文件(夾)。
patch 命令語法
patch [ -b [ -B Prefix ] ] [ -f ] [ -l ] [ -N ] [ -R ] [ -s ] [ -v ] [ -c | -e | -n ] [ -d Directory ] [ -D Define ] [ -F Number ] [ -i PatchFile ] [ -o OutFile ] [ -p Number ] [ -r RejectFile ] [ -x Number ] [ File ]
-p0 選項要從當前目錄查找目的文件(夾)
-p1 選項要忽略掉第一層目錄,從當前目錄開始查找。
以此類推
-E 選項說明如果發現了空文件,那麼就刪除它
-R 選項說明在補丁文件中的“新”文件和“舊”文件現在要調換過來了(實際上就是給新版本打補丁,讓它變成老版本)
關於版本控制, 還有一個非常常用的工具 ---- git
不過在git中,我們沒有必要直接使用diff和patch來做補丁,這樣做既危險又麻煩。
git提供了兩種簡單的patch方案。一是用git diff生成的標準patch,二是git format-patch生成的Git專用Patch。
這裏就不介紹git的用法,網上有大量的資料。我的博客裏也有相關介紹。
一 用git diff生成的標準patch
git diff產生標準的diff文件,可以用來產生patch 文件。
例如在master 分支有 a.txt文件
git checkout -b p1 /// 產生一個新分支p1
echo 'abcd' >> a.txt ///
git commit -am "patch p1" /// 產生變化並提交
git diff master > patch /// 將當前分支與master分支比較,併產生patch文件
git checkout master
git checkout -b p2 /// 產生一個與master相同的分支p2
git apply patch /// 運用patch 文件
git diff p1 /// 此時p1和p2分支相同了。
這裏注意,
1. 用 git diff [分支名,默認是master] > patch 產生補丁(patch)文件。
用 git apply <補丁文件>, 來打補丁。
2. 在那個目錄做補丁文件, 就在那個目錄應用補丁文件。
二 git format-patch生成的git專用補丁
在對應分支中
git format-patch -M master /// -M 表示要比較的分支
會產生一個 .patch文件
不僅有diff的信息,還有提交者,時間等等,仔細一看你會發現,這是個E-mail的文件,你可以直接發送它!這種patch,我們要用git am來應用。
git am xxxx.patch
(1)兼容性:很明顯,git diff生成的Patch兼容性強。如果你在修改的代碼的官方版本庫不是Git管理的版本庫,那麼你必須使用git diff生成的patch才能讓你的代碼被項目的維護人接受。
(2)除錯功能:對於git diff生成的patch,你可以用git apply --check 查看補丁是否能夠乾淨順利地應用到當前分支中;如果git format-patch 生成的補丁不能打到當前分支,git am會給出提示,並協助你完成打補丁工作,你也可以使用git am -3進行三方合併,詳細的做法可以參考git手冊或者《Progit》。從這一點上看,兩者除錯功能都很強。
(3)版本庫信息:由於git format-patch生成的補丁中含有這個補丁開發者的名字,因此在應用補丁時,這個名字會被記錄進版本庫,顯然,這樣做是恰當的。因此,目前使用Git的開源社區往往建議大家使用format-patch生成補丁。
目前先總結這麼多。