在代碼開發(fā)的過程中常常需要在源碼的基礎上進行修改,在合并代碼的時候一般就會以patch的形式進行提交,那么生成patch和應用patch就需要了解一下了。
所謂的patch其實就是文件對比,在Linux上使用diff命令(ref2)就可以得到patch.具體的命令為
diff -uprN test1/ test2/ > test.patch
上述命令對比了test1路徑下和test2路徑下的代碼差異,如果不需要對比某些內容,則在diff命令后使用–exclude-from=xx,在xx中指明哪些信息無需對比,如git信息等
test1/a.txt
123
123
test2/a.txt
123
123
456
test.patch
diff -uprN test1/a.txt test2/a.txt
+++ test2/a.txt 2018-08-01 14:31:55.000000000 +0800
@@ -1,3 +1,4 @@
123
123
+456
參數(shù)詳解:
-u 顯示有差異行的前后幾行(上下文), 默認是前后各3行, 這樣, patch中帶有更多的信息.
-p 顯示代碼所在的c函數(shù)的信息.
-r 遞歸地對比一個目錄和它的所有子目錄(即整個目錄樹).
-N 如果某個文件缺少了, 就當作是空文件來對比. 如果不使用本選項, 當diff發(fā)現(xiàn)舊代碼或者新代碼缺少文件時, 只簡單的提示缺少文件. 如果使用本選項, 會將新添加的文件全新打印出來作為新增的部分.
對比結果產(chǎn)生的test.patch就是我們需要的patch,假設現(xiàn)在需要未某一個未經(jīng)修改的源碼打上我們的patch,如給test1路徑下的文件打上patch
cd test1
patch -p1 < test.patch
生成的補丁中, 路徑信息包含了你的源碼根目錄的名稱, 但其他人的源碼根目錄可能是其它名字, 所以, 打補丁時, 要進入你的源碼根目錄, 并且告訴patch工具, 請忽略補丁中的路徑的第一級目錄(參數(shù)-p1).
這樣就可以將test.patch中的內容打到test1/a.txt中