單個檔案
diff -un ori-file mdf-file > mdf-file.patch // 生成patc**件
patch -p0 < mdf-file.patch // 將patch修改應用到源**
patch -re -p0 < mdf-file.patch // 回退patch的修改
多個檔案
diff -unr ori-dir mdf-dir > mdf-dir.patch
patch -p1 < mdf-dir.patch
patch -r -p1 < mdf-dir.patch
用此方法獲得的patch其實就是commit裡提交的code修改以及commit資訊,能夠靈活的獲取patch。可以獲取任意兩個commit之間的patch集。
使用方法(直接給一些examples):
git format-patch
$ git format-patch head^ #生成最近的1次commit的patch
$ git format-patch head^^ #生成最近的2次commit的patch
$ git format-patch head^^^ #生成最近的3次commit的patch
$ git format-patch head^^^^ #生成最近的4次commit的patch
$ git format-patch ..#生成兩個commit間的修改的patch(包含兩個commit. 和都是具體的commit號)
$ git format-patch -1 #生成單個commit的patch
$ git format-patch #生成某commit以來的修改patch(不包含該commit)
$ git format-patch --root #生成從根到r1提交的所有patch
git am
$ git am 0001-limit-log-function.patch # 將名字為0001-limit-log-function.patch的patch打上
$ git am --signoff 0001-limit-log-function.patch # 新增-s或者--signoff,還可以把自己的名字新增為signed off by資訊,作用是註明打patch的人是誰,因為有時打patch的人並不是patch的作者
$ git am ~/patch-set/*.patch # 將路徑~/patch-set/*.patch 按照先後順序打上
$ git am --abort # 當git am失敗時,用以將已經在am過程中打上的patch廢棄掉(比如有三個patch,打到第三個patch時有衝突,那麼這條命令會把打上的前兩個patch丟棄掉,返回沒有打patch的狀態)
$ git am --resolved # 當git am失敗,解決完衝突後,這條命令會接著打patch
如果打patch的過程中發生了衝突(conflicts),怎麼辦?
分析:方案一和方案二主要區別是解決衝突的方法不一樣。方案一是通過編輯patc**件的方式解決衝突,方案二是通過編輯衝突code檔案的方式解決衝突。這兩種方案區別比較大:經過實驗,核心區別在於,方案二無法驗證衝突有沒有切實的解決。即使你在方案二的第二步亂改一通,也能「打完」發生衝突的patch(並沒有檢測修改後的code檔案跟patch期望的是否相同)。因此,如果採用方案二,那麼再解決code檔案衝突後,需要人工去確認修改的正確性。
參考:
生成patch和打patch總結
git生成patch和打patch 方法1.git diff x mypatch patch p1 mypatch 方法二.單個commit git format patch 1 1bbe3c8c197a35f79bfddaba099270a2e54ea9c7 把patch檔案拷貝到git同目錄下 ...
Linux下生成patch和打patch
通過diff工具生成補丁,patch工具打上補丁.在使用diff之前,你需要保留乙份未修改過的原始碼,然後在其它地方修改原始碼的乙份拷貝.diff對比這兩份原始碼生成patch.修改過的原始碼必須保留原來的檔名,例如,如果你修改原始碼中的a.c檔案,那麼,修改後的檔案還是名為a.c,在修改之前你可以...
Linux下生成patch和打patch
在使用diff之前,你需要保留乙份未修改過的原始碼,然後在其它地方修改原始碼的乙份拷貝.diff對比這兩份原始碼生成patch.修改過的原始碼必須保留原來的檔名,例如,如果你修改原始碼中的a.c檔案,那麼,修改後的檔案還是名為a.c,在修改之前你可以複製a.c為a.orig.c進行備份.1 diff...