git cherry-pick 详解 —— Git 学习笔记 18
git cherry-pick 詳解
初識(shí) git cherry-pick(揀選)
揀選會(huì)提取某次提交的補(bǔ)丁,之后嘗試將其重新應(yīng)用到當(dāng)前分支上。 這種方式在你只想引入特性分支中的某個(gè)提交時(shí)很有用。
假設(shè)你的項(xiàng)目提交歷史如下:
如果你希望將提交 e43a6 拉取到 master 分支,你可以運(yùn)行:
# 當(dāng)前處于 master 分支$ git cherry-pick e43a6 Finished one cherry-pick. [master]: created a0a41a9: "More friendly message when locking the index fails."3 files changed, 17 insertions(+), 3 deletions(-)這樣會(huì)拉取和 e43a6 相同的更改,但是因?yàn)閼?yīng)用的日期不同,你會(huì)得到一個(gè)新的提交 SHA-1 值。 現(xiàn)在你的歷史會(huì)變成這樣:
現(xiàn)在你可以刪除這個(gè)特性分支(ruby_client),并丟棄不想拉入的提交(5ddae)。
需要說(shuō)明的是,提取某次提交的“補(bǔ)丁”,這個(gè)補(bǔ)丁是基于其父提交的。
下圖可以說(shuō)明:
我們要揀選提交 C4 到 maint 分支(maint 指向 C7),Git 會(huì)生成一個(gè)補(bǔ)丁(Δ=C4?C3\Delta = C4-C3Δ=C4?C3),然后把Δ\DeltaΔ應(yīng)用到C7上,也就是說(shuō)把 C4 對(duì) C3 的變化在 C7 上重放一遍。
為何會(huì)產(chǎn)生沖突
同 merge 操作一樣,揀選操作也可能產(chǎn)生沖突。有人會(huì)問(wèn):不會(huì)吧,打個(gè)補(bǔ)丁也能沖突?
當(dāng)然能。
用 diff 工具生成 patch 時(shí),我們所做的每一處修改都會(huì)連同它的“定位信息”(原始文件中的行號(hào)、修改處前三行和后三行的原始文本)一并保存到 patch 文件中。patch 被應(yīng)用時(shí),會(huì)在目標(biāo)文件中尋找“定位信息”,找到后再實(shí)施修改。可是,當(dāng)我們把補(bǔ)丁應(yīng)用到 C7 上時(shí),有可能找不到那些定位信息了:在master分支上,C2變成了C3,在maint分支上,C2變成了C6,又變成了C7,也許C3和C7相差越來(lái)越遠(yuǎn),C3中的上下文在C7中早已面目全非,不見蹤跡。于是應(yīng)用patch失敗,即發(fā)生沖突。
沖突了怎么辦
當(dāng)揀選發(fā)生沖突的時(shí)候,GIT 會(huì)采用三路合并算法。還是以上面的圖為例子,
當(dāng)你運(yùn)行命令 git cherry-pick C4 的時(shí)候,Local是C7,Remote是C4,Base是C3(即C4的父提交)。總結(jié):
當(dāng)你運(yùn)行命令
git cherry-pick <commit C>
如果沖突了,那么Git會(huì)嘗試三方合并
- LOCAL: the commit you’re merging on top of (i.e. the HEAD of your branch)
- REMOTE: the commit you’re cherry picking (i.e. commit C)
- BASE: the parent of the commit you’re cherry-picking (i.e. C^, ie the parent of C)
如果三方合并的時(shí)候又沖突了怎么辦?那只能靠我們?nèi)斯そ鉀Q了。
參考資料
【0】《Pro Git》(Scott Chacon, Ben Straub Version 2.1.14, 2018-05-19)
【1】 https://my.oschina.net/jiangyouxin/blog/108717
【2】《Git 高手之路》,人民郵電出版社
【3】 StackOverflow, https://stackoverflow.com/questions/10058068/in-a-git-cherry-pick-or-rebase-merge-conflict-how-are-base-aka-the-ancestor
總結(jié)
以上是生活随笔為你收集整理的git cherry-pick 详解 —— Git 学习笔记 18的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: android p安装教程,Androi
- 下一篇: git rebase(变基)—— Git