SVN和Git兩種版本控制系統生成和應用patch的區別。
一、SVN:
1、在指定版本間生成patch:
svn diff -r 421:438 > r421_438.patch //是r421以后當前目錄的所有修改,不包括r421修改
diff -r 421:422 是r422的當前目錄的所有修改。
diff -c 422 跟上一行一樣,表示r422的changes。
2、svn應用patch:
p1:數字1表示文件深度,即目錄,需要根據patch文件中修改路徑+當前所在目錄確定的.
例如:項目TestAndroid的源碼目錄:..../TestAndroid/test/media/...
test.patch文件中路徑:--- a/media/....
其中a不是有效路徑,下述為根據當前所在目錄不同,對應的命令參數
當當前所在目錄為test/時,patch -p1 ......
當當前所在目錄為media/時,patch -p0 ......
二、Git:
1、生成patch
(1)兩個commit間的修改(包含兩個commit)【此時-o 后面是生成patch文件夾名,此時所有patch均在該目錄下】
git format-patch <r1>..<r2>
如:
git format-patch d77aaac74845435744c49ae65511d9e1be79ed5c 046ee8f8423302f5070ca81b4e246516e919cd7a -o patchDir
(2)單個commit
git format-patch -1 <r1>
git format-patch -n <r1> 【從節點r1向前的n個節點的提交(包括r1)】
(3)從某commit以來的修改(不包含該commit)【記住:此時並非生成一個patch文件;而是每個提交都會生成一個patch文件】
git format-patch <r1>
2、檢查及應用patch
(1)把生成的patch文件拷貝到目標git目錄下
(2)檢查patch文件
git apply --stat 0001-minor-fix.patch
(3)查看是否能應用成功
git apply --check 0001-minor-fix.patch
(4)應用patch
git apply 0001-minor-fix.patch 【僅應用,並未提交;查看狀態顯示為 M】
(5)另一方法:【應用並提交,不建議使用】
git am -s < 0001-minor-fix.patch 【使用-s在提交記錄中會出現Signed-off-by信息,簽名信息】
或 git am < 0001-minor-fix.patch 【根據具體情況而定】
3、原文參考:http://www.linuxidc.com/Linux/2014-09/106323.htm
4、關於git中patch的一點思考:
(1)在本地Git Bash中自測,git patch 針對某個目錄或文件的使用?
上述情況不合理,patch不可能去針對某個目錄或文件;因為:修改一個bug時可能會涉及多個文件,這樣生成patch是按照某次提交來生成的,這樣才有意義,才是完成的。
若僅針對某個文件生成patch,這很有可能不是一次完整的提交,也沒實際意義!