Git Patch
Git patch的作用可以允許你將修改保存為一個(gè)標(biāo)準(zhǔn)的差異文件----patch文件喉悴,其他人拿到這個(gè)差異文件可以將你的修改其應(yīng)用到項(xiàng)目里船老。
典型的使用場(chǎng)景:目標(biāo)項(xiàng)目或者客戶的project跟你不在同一個(gè)網(wǎng)絡(luò)或者條件不允許在線提交代碼到目標(biāo)遠(yuǎn)程倉(cāng)庫(kù)榨汤;這時(shí)你就可以將需要提交的修改摘錄成patch文件發(fā)送給project的管理員,管理員通過(guò)應(yīng)用patch將您的修改合入project。
生成patch文件
兩種生成patch的方式:
git diff生成的UNIX標(biāo)準(zhǔn)補(bǔ)丁.diff文件厕诡,另外一種是git format-patch生成的Git專用.patch 文件党远。
從方式就可以看出來(lái):
.diff文件與.patch文件的區(qū)別就是diff生成的差異文件不附帶commit相關(guān)的作者削解、message等信息,只記錄差異沟娱。
這里僅介紹git format-patch標(biāo)準(zhǔn)的git patch文件生成和應(yīng)用
常用的生成從當(dāng)前commit往前n個(gè)commit
//生成從當(dāng)前commit往前x個(gè)commit的patch文件
git format-patch -x
//默認(rèn)有幾個(gè)commit就會(huì)生成幾個(gè).patch文件氛驮,并且默認(rèn)文件名從最早提交的commit 0001編號(hào)
//生成從指定commit_id(包含該commit) 往前x個(gè)commit的patch文件
git format-patch commit_id -x
//單獨(dú)生成某個(gè)commit的patch
git format-patch commit_id -1
//當(dāng)然也可以將所有commit的差異合并到一個(gè)patch文件,方便使用
git format-patch -x --stdout > patch-name.patch
//生成兩個(gè)commit之間的所有commit的patch文件(不包含start_commit):
git format-patch start_commit_Id..end_commit_Id
應(yīng)用patch文件
//檢查patch文件
git apply --stat xxx.patch
//檢查能否應(yīng)用成功
git apply --check xxxx.patch
上圖可見(jiàn)當(dāng)前0001-third-commit.patch應(yīng)用有提示error济似,因?yàn)楫?dāng)前處于4th-commit矫废,應(yīng)用patch發(fā)現(xiàn)已經(jīng)有third-commit有沖突
//使用git am xxx.patch可以應(yīng)用指定patch文件
//使用模式匹配git am *.patch會(huì)自動(dòng)根據(jù)編號(hào)依次應(yīng)用所有的patch文件(所以生成patch的編號(hào)自動(dòng)安裝提交先后生成)
git am *.patch
//使用git apply 命令也可以應(yīng)用patch(多用于.diff文件)但是相比于am命令不會(huì)將commit信息加入
應(yīng)用沖突解決
//git am出現(xiàn)沖突會(huì)報(bào)出錯(cuò)提示盏缤,然后整個(gè)停下來(lái)
//提示你查看應(yīng)用失敗的patch內(nèi)容,可以根據(jù)提示修改沖突然后
如上圖的commit狀態(tài)蓖扑,回退到 1th commit唉铜,然后添加一行"i am last line."再應(yīng)用摘下來(lái)的2th & 3th commit patch文件.
//am 應(yīng)用patch有沖突,則會(huì)提示命令用于查看沖突具體
git am --show-current-patch
//以及用于跳過(guò)律杠、繼續(xù)或者終止am命令
git am --continue
git am --skip
git am --abort
//使用git am -3 xxx.patch可以在發(fā)生沖突時(shí)使用git mergetool調(diào)用沖突合并工具解決沖突
git am -3 *.patch
git mergetool