git apply、git am打補丁.diff 和 .patch【轉】

來源:互聯網
上載者:User

標籤:著作權   分享   ted   class   多次提交   select   hit   pre   就是   

本文轉載自:https://www.jianshu.com/p/e5d801b936b6

前提:

產生patch:
git format-patch -M master
產生指定patch,0163bed3bf59ae74c36cc5138b4c24f1556d8304是commit id,-1是指從當前id開始,向下提交次數,包含此次且計數從1開始。
也就是說,我想要打出0163bed3bf59ae74c36cc5138b4c24f1556d8304當前的patch,則:
git format-patch 0163bed3bf59ae74c36cc5138b4c24f1556d8304 -1
想要打出0163bed3bf59ae74c36cc5138b4c24f1556d8304和它之前的一次提交的patch,則:
git format-patch 0163bed3bf59ae74c36cc5138b4c24f1556d8304 -2
產生diff:
git diff (id1) (id2) --binary --(path) > 目標檔案路徑
比如要產生frameworks/base/下的diff,儲存到~/gittest/下的f_b.diff:(注意:舊的id1在前)
git diff 206b47c132a80870c06d87c69a548bbfeebecd2d b5ce3e4ebe9503e370d734cecc12482bca023fdf --binary -- frameworks/base/ > ~/gittest/f_b.diff

打入 patch / diff:
git apply xxx.patch
git apply xxx.diff
檢查 patch / diff:
git apply --check xxx.patch
git apply --check xxx.diff
若git和需要打patch的檔案不在一個目錄:(git在framework下,patch要打入frameworks/base/下)
git apply --check --directory=base/ xxx.patch
git apply --directory=base/ xxx.patch
** git am 後面會說到,以及生產patch和打入patch的一些命令參數**

  1. 我們建立一個檔案夾,git init一下,類比diff / patch源環境
$ mkdir gittest$ git init
  1. 然後建立一個空檔案 test,然後首次提交
$ touch test$ git add .$ git commit -m "test init"
  1. 在裡面加入11111,add,commit(add 11111)一次;
    在裡面加入22222,add,commit(add 22222)一次;
    ...
    在裡面加入55555,add,commit(add 55555)一次;
    一共提交5次,可以看到提交了5次。
 gitk產生patch / diff 檔案(我們單獨建一個檔案夾來存patch和diff --> ~/patch/patch/):

在工作中,二者選一個就可以,看自己的需求。
patch相對於diff,多了提交記錄,也就是說可以原封不動的把他人commit內容寫上去,但是操作比diff麻煩一些

  • ** 產生patch:**
    我們記錄一下最新的commit id : 21ebfb1ef6a0a9b56d46036c036e8377b56b2da5,有5次提交。
$ git format-patch 21ebfb1ef6a0a9b56d46036c036e8377b56b2da5 -5
 git patch

產生了包含當前id和之前的4個id的patch,一共5個,命名也有規律000X+commit的內容.patch
我們把這5個移到~/patch/patch/中。

  • ** 產生diff:**
    我們記錄要產生diff的區間,!!包上不包下!!

就是說我要產生 11111~55555的diff
id1 是 test init的id;1cf68afcf3e089a349c8ee534dc3ff44d11a6624
id2是add 55555的id。21ebfb1ef6a0a9b56d46036c036e8377b56b2da5

$ git diff 1cf68afcf3e089a349c8ee534dc3ff44d11a6624 21ebfb1ef6a0a9b56d46036c036e8377b56b2da5 --binary -- . > ~/patch/patch/test.diff

diff 多次提交可以是一個檔案,但是patch不行,因為它裡面有commit記錄!

打 patch / diff 補丁(無衝突):

我們在目前的目錄建立一個需要打補丁的檔案夾(gittest1),裡面也有一個空的test檔案。
然後我們把patch/diff打入gittest1/test。
執行最開始的1、2即可,改一下檔案夾名稱就ok

 gittest1
  • 打patch(不包含commit內容)
    1. 檢查patch是否可用,沒顯示文字,就說明可用,且無衝突;
      git apply --check ~/patch/patch/0001-add-11111.patch
      一般檢查一個就可以。
    2. 打入patch,可以批量,也可以單個。
      git apply ~/patch/patch/*.patch
    3. 肯定會成功,因為沒有衝突。我們查看一下
      git diff

 

  git diff
5個patch都打上去了,接著就可以 git add / commit提交了。 但是這樣沒有commit記錄。

 

  • 打patch(包含commit內容 git am git checkout . 撤銷一下
    1. 檢查patch是否可用,沒顯示文字,就說明可用,且無衝突;
      git apply --check ~/patch/patch/0001-add-11111.patch
    2. 打入patch,可以批量,也可以單個。
      ** git am ~/patch/patch/*.patch **
    3. 肯定會成功,因為沒有衝突。我們查看一下
        
      gitk
 gitk

我們發現已經自動commit,不用add、commit,可以直接push。

  • **打diff ** git reset --hard 4c6eb312e94214a5f34fa3f119382ace647b1b3c 撤銷一下
    1. 檢查diff是否可用,沒顯示文字,就說明可用,且無衝突;
      git apply --check ~/patch/patch/test.diff
    2. 打入diff;
      git apply ~/patch/patch/test.diff
    3. 肯定會成功,因為沒有衝突。我們查看一下
      git diff

 

 git diff
接著就可以 git add / commit提交了。 但是這樣沒有commit記錄。

 

打 patch / diff 補丁(有衝突):

我們還原gittest1/test的初始狀態,然後修改一下test檔案,寫入00000,,然後add、commit。

 add 00000
  • 打patch
    1. 檢查patch是否可用,沒顯示文字,就說明可用,且無衝突;
      git apply --check ~/patch/patch/0001-add-11111.patch

error: 打補丁失敗:test:0
error: test:補丁未應用

說明是可以用,但是有衝突。  2. 打入patch,可以批量,也可以單個。> 因為在check的時候知道已經有衝突了,就不好用apply來打patch,如果一定要用的話,建議一個一個apply,所以很麻煩,不如用diff。在這裡要用到 **git am**    ** `` git am ~/patch/patch/*.patch `` **

正應用:add 11111
error: 打補丁失敗:test:0
error: test:補丁未應用
補丁失敗於 0001 add 11111
失敗的補丁檔案副本位於:
/home/deshui/yudeshui/log/gittest1/.git/rebase-apply/patch
當您解決了此問題後,執行 "git am --continue"。
如果您想跳過此補丁,則執行 "git am --skip"。
要恢複原分支並停止打補丁,執行 "git am --abort"。

這行話告訴你,patch衝突了,但是有三個選項 ``git am --continue``、``git am --skip``、``git am --abort``** 這時候不要動!不要動!不要動!**    1. 解決衝突。     > **我們 `` gedit test ``,在裡面手動加入11111**,因為我們加入了00000,導致錯行,所以接下來的4個patch都會有衝突。    2. 提交記錄。    `` git add test ``    `` git am --continue ``

正應用:add 11111
正應用:add 22222
error: 打補丁失敗:test:1
error: test:補丁未應用
補丁失敗於 0002 add 22222
失敗的補丁檔案副本位於:
~/gittest1/.git/rebase-apply/patch
當您解決了此問題後,執行 "git am --continue"。
如果您想跳過此補丁,則執行 "git am --skip"。
要恢複原分支並停止打補丁,執行 "git am --abort"。

我們``gitk``一下,發現已經commit已經有add 11111的記錄了!** 同上操作,一直修改到44444 **     `` git add test ``    `` git am --continue ``

正應用:add 44444
正應用:add 55555

這樣就完整的解決衝突,保留commit了。![git am finish](http://upload-images.jianshu.io/upload_images/3153157-f2a6520f1ed25382.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)- **打diff ** ``git reset --hard 0050cda7f22df985d79b9b98da9bfc282ea10ef1 `` 撤銷到add 00000  1. 檢查diff是否可用,肯定有衝突。`` git apply --check ~/patch/patch/test.diff ``

error: 打補丁失敗:test:0
error: test:補丁未應用

  2. 打入diff;  `` git apply --reject --ignore-whitespace ~/patch/patch/test.diff 2>&1 | tee ~/patch/patch/testdiff.log``

這裡reject是產生一個.rej的檔案,是一個差異檔案。
ignore-whitespace是忽略多餘的空格。
2>&1是值錯誤資訊
tee 錯誤資訊輸出到控制台
~/patch/patch/testdiff.log 錯誤資訊儲存在這個檔案裡
*********輸出log**********
檢查補丁 test...
error: 當查詢:
error: 打補丁失敗:test:0
應用 test 個補丁,其中 1 個被拒絕...
拒絕第 #1 個片段。
*********輸出log**********

  3. 這時候我們發現,檔案夾多了一個test.rej的檔案,開啟它。

diff a/test b/test (rejected hunks)
@@ -0,0 +1,5 @@
+11111
+22222
+33333
+44444
+55555

這個告訴我們,要在test中加入的資訊,我們開啟test補上就可以了。手動!然後add / commit 就可以了。###END
Git


yotods
連結:https://www.jianshu.com/p/e5d801b936b6
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

git apply、git am打補丁.diff 和 .patch【轉】

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.