日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

git apply、git am打补丁.diff 和 .patch

發(fā)布時(shí)間:2025/4/16 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 git apply、git am打补丁.diff 和 .patch 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前提:

生成patch:
git format-patch -M master
生成指定patch,0163bed3bf59ae74c36cc5138b4c24f1556d8304是commit id,-1是指從當(dāng)前id開(kāi)始,向下提交次數(shù),包含此次且計(jì)數(shù)從1開(kāi)始。
也就是說(shuō),我想要打出0163bed3bf59ae74c36cc5138b4c24f1556d8304當(dāng)前的patch,則:
git format-patch 0163bed3bf59ae74c36cc5138b4c24f1556d8304 -1
想要打出0163bed3bf59ae74c36cc5138b4c24f1556d8304和它之前的一次提交的patch,則:
git format-patch 0163bed3bf59ae74c36cc5138b4c24f1556d8304 -2
生成diff:
git diff (id1) (id2) --binary --(path) > 目標(biāo)文件路徑
比如要生成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的文件不在一個(gè)目錄:(git在framework下,patch要打入frameworks/base/下)
git apply --check --directory=base/ xxx.patch
git apply --directory=base/ xxx.patch
** git am 后面會(huì)說(shuō)到,以及生產(chǎn)patch和打入patch的一些命令參數(shù)**

  • 我們創(chuàng)建一個(gè)文件夾,git init一下,模擬diff / patch源環(huán)境
  • $ mkdir gittest $ git init
  • 然后創(chuàng)建一個(gè)空文件 test,然后首次提交
  • $ touch test $ git add . $ git commit -m "test init"
  • 在里面加入11111,add,commit(add 11111)一次;
    在里面加入22222,add,commit(add 22222)一次;
    ...
    在里面加入55555,add,commit(add 55555)一次;
    一共提交5次,可以看到提交了5次。
  • gitk

    生成patch / diff 文件(我們單獨(dú)建一個(gè)文件夾來(lái)存patch和diff --> ~/patch/patch/):

    在工作中,二者選一個(gè)就可以,看自己的需求。
    patch相對(duì)于diff,多了提交記錄,也就是說(shuō)可以原封不動(dòng)的把他人commit內(nèi)容寫(xiě)上去,但是操作比diff麻煩一些

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

    git patch

    ?

    生成了包含當(dāng)前id和之前的4個(gè)id的patch,一共5個(gè),命名也有規(guī)律000X+commit的內(nèi)容.patch
    我們把這5個(gè)移到~/patch/patch/中。

    • 生成diff:
      我們記錄要生成diff的區(qū)間,!!包上不包下!!

    就是說(shuō)我要生成 11111~55555的diff
    id1 是 test init的id;1cf68afcf3e089a349c8ee534dc3ff44d11a6624
    id2是add 55555的id。21ebfb1ef6a0a9b56d46036c036e8377b56b2da5

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

    diff 多次提交可以是一個(gè)文件,但是patch不行,因?yàn)樗锩嬗衏ommit記錄!

    打 patch / diff 補(bǔ)丁(無(wú)沖突):

    我們?cè)诋?dāng)前目錄創(chuàng)建一個(gè)需要打補(bǔ)丁的文件夾(gittest1),里面也有一個(gè)空的test文件。
    然后我們把patch/diff打入gittest1/test。
    執(zhí)行最開(kāi)始的1、2即可,改一下文件夾名稱(chēng)就ok

    gittest1

    • 打patch(不包含commit內(nèi)容)
    • 檢查patch是否可用,沒(méi)顯示文字,就說(shuō)明可用,且無(wú)沖突;
      git apply --check ~/patch/patch/0001-add-11111.patch
      一般檢查一個(gè)就可以。
    • 打入patch,可以批量,也可以單個(gè)。
      git apply ~/patch/patch/*.patch
    • 肯定會(huì)成功,因?yàn)闆](méi)有沖突。我們查看一下
      git diff

    ?

    git diff


    5個(gè)patch都打上去了,接著就可以 git add / commit提交了。但是這樣沒(méi)有commit記錄。

    ?

    • 打patch(包含commit內(nèi)容 git am) git checkout . 撤銷(xiāo)一下
    • 檢查patch是否可用,沒(méi)顯示文字,就說(shuō)明可用,且無(wú)沖突;
      git apply --check ~/patch/patch/0001-add-11111.patch
    • 打入patch,可以批量,也可以單個(gè)。
      ** git am ~/patch/patch/*.patch **
    • 肯定會(huì)成功,因?yàn)闆](méi)有沖突。我們查看一下


      gitk

    gitk

    ?

    我們發(fā)現(xiàn)已經(jīng)自動(dòng)commit,不用add、commit,可以直接push。

    • **打diff ** git reset --hard 4c6eb312e94214a5f34fa3f119382ace647b1b3c 撤銷(xiāo)一下
    • 檢查diff是否可用,沒(méi)顯示文字,就說(shuō)明可用,且無(wú)沖突;
      git apply --check ~/patch/patch/test.diff
    • 打入diff;
      git apply ~/patch/patch/test.diff
    • 肯定會(huì)成功,因?yàn)闆](méi)有沖突。我們查看一下
      git diff

    ?

    git diff


    接著就可以 git add / commit提交了。但是這樣沒(méi)有commit記錄。

    ?

    打 patch / diff 補(bǔ)丁(有沖突):

    我們還原gittest1/test的初始狀態(tài),然后修改一下test文件,寫(xiě)入00000,,然后add、commit。

    add 00000

    • 打patch
    • 檢查patch是否可用,沒(méi)顯示文字,就說(shuō)明可用,且無(wú)沖突;
      git apply --check ~/patch/patch/0001-add-11111.patch
    error: 打補(bǔ)丁失敗:test:0 error: test:補(bǔ)丁未應(yīng)用

    說(shuō)明是可以用,但是有沖突。

  • 打入patch,可以批量,也可以單個(gè)。
  • 因?yàn)樵赾heck的時(shí)候知道已經(jīng)有沖突了,就不好用apply來(lái)打patch,如果一定要用的話(huà),建議一個(gè)一個(gè)apply,所以很麻煩,不如用diff。
    在這里要用到 git am

    git am ~/patch/patch/*.patch

    正應(yīng)用:add 11111 error: 打補(bǔ)丁失敗:test:0 error: test:補(bǔ)丁未應(yīng)用 補(bǔ)丁失敗于 0001 add 11111 失敗的補(bǔ)丁文件副本位于:/home/deshui/****/log/gittest1/.git/rebase-apply/patch 當(dāng)您解決了此問(wèn)題后,執(zhí)行 "git am --continue"。 如果您想跳過(guò)此補(bǔ)丁,則執(zhí)行 "git am --skip"。 要恢復(fù)原分支并停止打補(bǔ)丁,執(zhí)行 "git am --abort"。

    這行話(huà)告訴你,patch沖突了,但是有三個(gè)選項(xiàng) git am --continue、git am --skip、git am --abort
    這時(shí)候不要?jiǎng)?#xff01;不要?jiǎng)?#xff01;不要?jiǎng)?#xff01;
    1. 解決沖突。
    > 我們 gedit test,在里面手動(dòng)加入11111,因?yàn)槲覀兗尤肓?0000,導(dǎo)致錯(cuò)行,所以接下來(lái)的4個(gè)patch都會(huì)有沖突。
    2. 提交記錄。
    git add test
    git am --continue

    正應(yīng)用:add 11111 正應(yīng)用:add 22222 error: 打補(bǔ)丁失敗:test:1 error: test:補(bǔ)丁未應(yīng)用 補(bǔ)丁失敗于 0002 add 22222 失敗的補(bǔ)丁文件副本位于:~/gittest1/.git/rebase-apply/patch 當(dāng)您解決了此問(wèn)題后,執(zhí)行 "git am --continue"。 如果您想跳過(guò)此補(bǔ)丁,則執(zhí)行 "git am --skip"。 要恢復(fù)原分支并停止打補(bǔ)丁,執(zhí)行 "git am --abort"。

    我們gitk一下,發(fā)現(xiàn)已經(jīng)commit已經(jīng)有add 11111的記錄了!
    ** 同上操作,一直修改到44444 **
    git add test
    git am --continue

    正應(yīng)用:add 44444 正應(yīng)用:add 55555

    這樣就完整的解決沖突,保留commit了。

    git am finish

    • **打diff ** git reset --hard 0050cda7f22df985d79b9b98da9bfc282ea10ef1 撤銷(xiāo)到add 00000
    • 檢查diff是否可用,肯定有沖突。
      git apply --check ~/patch/patch/test.diff
    error: 打補(bǔ)丁失敗:test:0 error: test:補(bǔ)丁未應(yīng)用
  • 打入diff;
    git apply --reject --ignore-whitespace ~/patch/patch/test.diff 2>&1 | tee ~/patch/patch/testdiff.log
  • 這里reject是生成一個(gè).rej的文件,是一個(gè)差異文件。 ignore-whitespace是忽略多余的空格。 2>&1是值錯(cuò)誤信息tee 錯(cuò)誤信息輸出到控制臺(tái) ~/patch/patch/testdiff.log 錯(cuò)誤信息保存在這個(gè)文件里 *********輸出log********** 檢查補(bǔ)丁 test... error: 當(dāng)查詢(xún): error: 打補(bǔ)丁失敗:test:0 應(yīng)用 test 個(gè)補(bǔ)丁,其中 1 個(gè)被拒絕... 拒絕第 #1 個(gè)片段。 *********輸出log**********
  • 這時(shí)候我們發(fā)現(xiàn),文件夾多了一個(gè)test.rej的文件,打開(kāi)它。
  • diff a/test b/test (rejected hunks) @@ -0,0 +1,5 @@ +11111 +22222 +33333 +44444 +55555

    這個(gè)告訴我們,要在test中加入的信息,我們打開(kāi)test補(bǔ)上就可以了。手動(dòng)!
    然后add / commit 就可以了。

    END



    作者:yotods
    鏈接:https://www.jianshu.com/p/e5d801b936b6
    來(lái)源:簡(jiǎn)書(shū)
    簡(jiǎn)書(shū)著作權(quán)歸作者所有,任何形式的轉(zhuǎn)載都請(qǐng)聯(lián)系作者獲得授權(quán)并注明出處。

    總結(jié)

    以上是生活随笔為你收集整理的git apply、git am打补丁.diff 和 .patch的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。