git apply熙参、git am打補丁.diff 和 .patch

前提:

生成patch:
git format-patch -M master
生成指定patch仙蚜,0163bed3bf59ae74c36cc5138b4c24f1556d8304是commit id渐溶,-1是指從當前id開始毛秘,向下提交次數(shù)灾而,包含此次且計數(shù)從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 后面會說到橙困,以及生產(chǎn)patch和打入patch的一些命令參數(shù)**

  1. 我們創(chuàng)建一個文件夾,git init一下耕餐,模擬diff / patch源環(huán)境
$ mkdir gittest
$ git init
  1. 然后創(chuàng)建一個空文件 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內(nèi)容寫上去酿联,但是操作比diff麻煩一些

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

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

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

就是說我要生成 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 補睹ρ帷(無沖突):

我們在當前目錄創(chuàng)建一個需要打補丁的文件夾(gittest1),里面也有一個空的test文件江咳。
然后我們把patch/diff打入gittest1/test逢净。
執(zhí)行最開始的1、2即可歼指,改一下文件夾名稱就ok

gittest1
  • 打patch(不包含commit內(nèi)容)
    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內(nèi)容 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

我們發(fā)現(xiàn)已經(jīng)自動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的初始狀態(tài),然后修改一下test文件刷晋,寫入00000,盖高,然后add、commit眼虱。

add 00000
  • 打patch
    1. 檢查patch是否可用喻奥,沒顯示文字,就說明可用捏悬,且無沖突撞蚕;
      git apply --check ~/patch/patch/0001-add-11111.patch
error: 打補丁失敗:test:0
error: test:補丁未應用

說明是可以用过牙,但是有沖突甥厦。

  1. 打入patch,可以批量寇钉,也可以單個刀疙。

因為在check的時候知道已經(jīng)有沖突了,就不好用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
當您解決了此問題后征懈,執(zhí)行 "git am --continue"。
如果您想跳過此補丁揩悄,則執(zhí)行 "git am --skip"卖哎。
要恢復原分支并停止打補丁,執(zhí)行 "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
當您解決了此問題后池充,執(zhí)行 "git am --continue"桩引。
如果您想跳過此補丁,則執(zhí)行 "git am --skip"纵菌。
要恢復原分支并停止打補丁阐污,執(zhí)行 "git am --abort"。

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

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

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

git am finish
  • **打diff ** git reset --hard 0050cda7f22df985d79b9b98da9bfc282ea10ef1 撤銷到add 00000
    1. 檢查diff是否可用,肯定有沖突忱详。
      git apply --check ~/patch/patch/test.diff
error: 打補丁失斘Ю础:test:0
error: test:補丁未應用
  1. 打入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**********
  1. 這時候我們發(fā)現(xiàn),文件夾多了一個test.rej的文件糯钙,打開它粪狼。
diff a/test b/test  (rejected hunks)
@@ -0,0 +1,5 @@
+11111
+22222
+33333
+44444
+55555

這個告訴我們,要在test中加入的信息任岸,我們打開test補上就可以了再榄。手動!
然后add / commit 就可以了享潜。

END

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末困鸥,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子米碰,更是在濱河造成了極大的恐慌窝革,老刑警劉巖购城,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異虐译,居然都是意外死亡瘪板,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進店門漆诽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來侮攀,“玉大人,你說我怎么就攤上這事厢拭±加ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵供鸠,是天一觀的道長畦贸。 經(jīng)常有香客問我,道長楞捂,這世上最難降的妖魔是什么薄坏? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮寨闹,結(jié)果婚禮上胶坠,老公的妹妹穿的比我還像新娘。我一直安慰自己繁堡,他們只是感情好沈善,可當我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著椭蹄,像睡著了一般闻牡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上绳矩,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天澈侠,我揣著相機與錄音,去河邊找鬼埋酬。 笑死,一個胖子當著我的面吹牛烧栋,可吹牛的內(nèi)容都是我干的写妥。 我是一名探鬼主播,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼审姓,長吁一口氣:“原來是場噩夢啊……” “哼珍特!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起魔吐,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤扎筒,失蹤者是張志新(化名)和其女友劉穎莱找,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嗜桌,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡奥溺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了骨宠。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浮定。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖层亿,靈堂內(nèi)的尸體忽然破棺而出桦卒,到底是詐尸還是另有隱情,我是刑警寧澤匿又,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布方灾,位于F島的核電站,受9級特大地震影響碌更,放射性物質(zhì)發(fā)生泄漏裕偿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一针贬、第九天 我趴在偏房一處隱蔽的房頂上張望击费。 院中可真熱鬧,春花似錦桦他、人聲如沸蔫巩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽圆仔。三九已至,卻和暖如春蔫劣,著一層夾襖步出監(jiān)牢的瞬間坪郭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工脉幢, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留歪沃,地道東北人。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓嫌松,卻偏偏與公主長得像沪曙,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子萎羔,可洞房花燭夜當晚...
    茶點故事閱讀 44,647評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1. GIT命令 git init在本地新建一個repo液走,進入一個項目目錄,執(zhí)行g(shù)it init,會初始化一個re...
    江邊一蓑煙閱讀 799評論 0 0
  • 1.設(shè)置 初次使用需要設(shè)置姓名和郵箱git config --global user.name "git用戶名"g...
    jrg陳咪咪sunny閱讀 758評論 0 1
  • 本片內(nèi)容轉(zhuǎn)自CSDN http://blog.csdn.net/ithomer/article/details/7...
    五娃兒閱讀 4,933評論 2 88
  • 2017年已過去半個月了缘眶,我還在總結(jié)2016年呢嘱根,不得不說拖延癥有點嚴重,得治巷懈。 2016年對我最有影響...
    曼頭閱讀 275評論 0 0
  • 好多年的心結(jié)砸喻,今天自己悄悄治療了柔逼,沒有特別難過,只是看透了~再留戀割岛,也沒有好結(jié)果愉适,所以還是勇敢地說拜拜吧。嘿癣漆,生活...
    瀟雨姑娘閱讀 299評論 1 3