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