生成patch和打patch

2021-09-24 13:01:46 字數 1927 閱讀 4338

單個檔案

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...