推薦指數(shù)五顆星S骸C俨!!
對于多分支的代碼庫培漏,將代碼從一個(gè)分支轉(zhuǎn)移到另一個(gè)分支是常見需求溪厘。
這時(shí)分兩種情況。一種情況是牌柄,你需要另一個(gè)分支的所有代碼變動(dòng)畸悬,那么就采用合并(git merge
)。另一種情況是珊佣,你只需要部分代碼變動(dòng)(某幾個(gè)提交)蹋宦,這時(shí)可以采用 Cherry pick。
一咒锻、基本用法
git cherry-pick
命令的作用冷冗,就是將指定的提交(commit)應(yīng)用于其他分支。
$ git cherry-pick <commitHash>
上面命令就會(huì)將指定的提交commitHash
惑艇,應(yīng)用于當(dāng)前分支蒿辙。這會(huì)在當(dāng)前分支產(chǎn)生一個(gè)新的提交,當(dāng)然它們的哈希值會(huì)不一樣敦捧。
舉例來說须板,代碼倉庫有master
和feature
兩個(gè)分支。
a - b - c - d Master
\
e - f - g Feature
現(xiàn)在將提交f
應(yīng)用到master
分支兢卵。
# 切換到 master 分支
$ git checkout master
# Cherry pick 操作
$ git cherry-pick f
上面的操作完成以后习瑰,代碼庫就變成了下面的樣子。
a - b - c - d - f Master
\
e - f - g Feature
從上面可以看到秽荤,master
分支的末尾增加了一個(gè)提交f
甜奄。
git cherry-pick
命令的參數(shù)柠横,不一定是提交的哈希值,分支名也是可以的课兄,表示轉(zhuǎn)移該分支的最新提交牍氛。
$ git cherry-pick feature
上面代碼表示將feature
分支的最近一次提交,轉(zhuǎn)移到當(dāng)前分支烟阐。
二搬俊、轉(zhuǎn)移多個(gè)提交
Cherry pick 支持一次轉(zhuǎn)移多個(gè)提交蜒茄。
$ git cherry-pick <HashA> <HashB>
上面的命令將 A 和 B 兩個(gè)提交應(yīng)用到當(dāng)前分支檀葛。這會(huì)在當(dāng)前分支生成兩個(gè)對應(yīng)的新提交玩祟。
如果想要轉(zhuǎn)移一系列的連續(xù)提交屿聋,可以使用下面的簡便語法。
$ git cherry-pick A..B
上面的命令可以轉(zhuǎn)移從 A 到 B 的所有提交润讥。它們必須按照正確的順序放置:提交 A 必須早于提交 B转锈,否則命令將失敗,但不會(huì)報(bào)錯(cuò)黑忱。
注意勒魔,使用上面的命令冠绢,提交 A 將不會(huì)包含在 Cherry pick 中常潮。如果要包含提交 A,可以使用下面的語法孵户。
$ git cherry-pick A^..B
三岔留、配置項(xiàng)
git cherry-pick
命令的常用配置項(xiàng)如下献联。
(1)-e
何址,--edit
打開外部編輯器用爪,編輯提交信息胁镐。
(2)-n
,--no-commit
只更新工作區(qū)和暫存區(qū)颇玷,不產(chǎn)生新的提交亚隙。
(3)-x
在提交信息的末尾追加一行(cherry picked from commit ...)
违崇,方便以后查到這個(gè)提交是如何產(chǎn)生的。
(4)-s
渣淳,--signoff
在提交信息的末尾追加一行操作者的簽名入愧,表示是誰進(jìn)行了這個(gè)操作嗤谚。
(5)-m parent-number
,--mainline parent-number
如果原始提交是一個(gè)合并節(jié)點(diǎn)旁赊,來自于兩個(gè)分支的合并终畅,那么 Cherry pick 默認(rèn)將失敗竟闪,因?yàn)樗恢缿?yīng)該采用哪個(gè)分支的代碼變動(dòng)。
-m
配置項(xiàng)告訴 Git妖爷,應(yīng)該采用哪個(gè)分支的變動(dòng)赠涮。它的參數(shù)parent-number
是一個(gè)從1
開始的整數(shù),代表原始提交的父分支編號(hào)斜友。
$ git cherry-pick -m 1 <commitHash>
上面命令表示垃它,Cherry pick 采用提交commitHash
來自編號(hào)1的父分支的變動(dòng)国拇。
一般來說,1號(hào)父分支是接受變動(dòng)的分支(the branch being merged into),2號(hào)父分支是作為變動(dòng)來源的分支(the branch being merged from)缴挖。
四忆嗜、代碼沖突
如果操作過程中發(fā)生代碼沖突崎岂,Cherry pick 會(huì)停下來,讓用戶決定如何繼續(xù)操作绩卤。
(1)--continue
用戶解決代碼沖突后江醇,第一步將修改的文件重新加入暫存區(qū)(git add .
)陶夜,第二步使用下面的命令,讓 Cherry pick 過程繼續(xù)執(zhí)行。
$ git cherry-pick --continue
(2)--abort
發(fā)生代碼沖突后捂贿,放棄合并胳嘲,回到操作前的樣子。
(3)--quit
發(fā)生代碼沖突后颜屠,退出 Cherry pick甫窟,但是不回到操作前的樣子。
五尔破、轉(zhuǎn)移到另一個(gè)代碼庫
Cherry pick 也支持轉(zhuǎn)移另一個(gè)代碼庫的提交浇衬,方法是先將該庫加為遠(yuǎn)程倉庫耘擂。
$ git remote add target git://gitUrl
上面命令添加了一個(gè)遠(yuǎn)程倉庫target
。
然后秩霍,將遠(yuǎn)程代碼抓取到本地前域。
$ git fetch target
上面命令將遠(yuǎn)程代碼倉庫抓取到本地韵吨。
接著归粉,檢查一下要從遠(yuǎn)程倉庫轉(zhuǎn)移的提交,獲取它的哈希值届榄。
$ git log target/master
最后倔喂,使用git cherry-pick
命令轉(zhuǎn)移提交席噩。
$ git cherry-pick <commitHash>
(完)
感謝原作者(阮一峰)