git apply、git am打补丁.diff 和 .patch
前提:
生成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的一些命令參數**
在里面加入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 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內容)
- 檢查patch是否可用,沒顯示文字,就說明可用,且無沖突;
git apply --check ~/patch/patch/0001-add-11111.patch
一般檢查一個就可以。 - 打入patch,可以批量,也可以單個。
git apply ~/patch/patch/*.patch - 肯定會成功,因為沒有沖突。我們查看一下
git diff
?
git diff
5個patch都打上去了,接著就可以 git add / commit提交了。但是這樣沒有commit記錄。
?
- 打patch(包含commit內容 git am) git checkout . 撤銷一下
- 檢查patch是否可用,沒顯示文字,就說明可用,且無沖突;
git apply --check ~/patch/patch/0001-add-11111.patch - 打入patch,可以批量,也可以單個。
** git am ~/patch/patch/*.patch ** - 肯定會成功,因為沒有沖突。我們查看一下
gitk
gitk
?
我們發現已經自動commit,不用add、commit,可以直接push。
- **打diff ** git reset --hard 4c6eb312e94214a5f34fa3f119382ace647b1b3c 撤銷一下
- 檢查diff是否可用,沒顯示文字,就說明可用,且無沖突;
git apply --check ~/patch/patch/test.diff - 打入diff;
git apply ~/patch/patch/test.diff - 肯定會成功,因為沒有沖突。我們查看一下
git diff
?
git diff
接著就可以 git add / commit提交了。但是這樣沒有commit記錄。
?
打 patch / diff 補丁(有沖突):
我們還原gittest1/test的初始狀態,然后修改一下test文件,寫入00000,,然后add、commit。
add 00000
- 打patch
- 檢查patch是否可用,沒顯示文字,就說明可用,且無沖突;
git apply --check ~/patch/patch/0001-add-11111.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/****/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
我們gitk一下,發現已經commit已經有add 11111的記錄了!
** 同上操作,一直修改到44444 **
git add test
git am --continue
這樣就完整的解決沖突,保留commit了。
git am finish
- **打diff ** git reset --hard 0050cda7f22df985d79b9b98da9bfc282ea10ef1 撤銷到add 00000
- 檢查diff是否可用,肯定有沖突。
git apply --check ~/patch/patch/test.diff
git apply --reject --ignore-whitespace ~/patch/patch/test.diff 2>&1 | tee ~/patch/patch/testdiff.log
這個告訴我們,要在test中加入的信息,我們打開test補上就可以了。手動!
然后add / commit 就可以了。
END
作者:yotods
鏈接:https://www.jianshu.com/p/e5d801b936b6
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權并注明出處。
總結
以上是生活随笔為你收集整理的git apply、git am打补丁.diff 和 .patch的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: git: git add --ignor
- 下一篇: msm8953+android8.1蓝牙