git高级特性之 - cherry-pick
文章目錄
- 背景
- 介紹
- 配置項(xiàng)
- -e,--edit
- -n,--no-commit
- -x
- -s,--signoff
- -m parent-number,--mainline parent-number
- 實(shí)踐案例
- 自動(dòng)提交
- 不自動(dòng)提交
- 增加額外說(shuō)明信息
- 重新編輯提交信息
- 有沖突的情況
- cherry-pick分支
- 一次pick連續(xù)的多個(gè)提交
- 轉(zhuǎn)移到另一個(gè)代碼庫(kù)
背景
在開(kāi)發(fā)過(guò)程中,我們一般會(huì)使用多分支來(lái)管理開(kāi)發(fā)。在特殊情況下,其中一個(gè)分支的改動(dòng),我想搬到我的另一個(gè)分支(它會(huì)作為一個(gè)新的提交引入到你當(dāng)前分支上),關(guān)于這種操作,如果使用git 的話,那就可以做到了,這就是我們這篇博客想要介紹的 git cherry-pick 高級(jí)特性。
介紹
git cherry-pick命令的作用,就是將指定的提交(commit)應(yīng)用于其他分支。
首先看下官方介紹: 運(yùn)行下面的命令
git help cherry-pick基本語(yǔ)法:
git cherry-pick [--edit] [-n] [-m parent-number] [-s] [-x] [--ff][-S[<keyid>]] <commit>…? git cherry-pick --continue git cherry-pick --quit git cherry-pick --abort其中: -n, --no-commit 不自動(dòng)提交 -e, --edit 編輯提交信息配置項(xiàng)
git cherry-pick命令的常用配置項(xiàng)如下。
-e,–edit
打開(kāi)外部編輯器,編輯提交信息。
-n,–no-commit
只更新工作區(qū)和暫存區(qū),不產(chǎn)生新的提交。
-x
在提交信息的末尾追加一行(cherry picked from commit …),方便以后查到這個(gè)提交是如何產(chǎn)生的。
-s,–signoff
在提交信息的末尾追加一行操作者的簽名,表示是誰(shuí)進(jìn)行了這個(gè)操作。
-m parent-number,–mainline parent-number
如果原始提交是一個(gè)合并節(jié)點(diǎn),來(lái)自于兩個(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開(kāi)始的整數(shù),代表原始提交的父分支編號(hào)。
git cherry-pick -m 1 <commitHash>上面命令表示,Cherry pick 采用提交commitHash來(lái)自編號(hào)1的父分支的變動(dòng)。
一般來(lái)說(shuō),1號(hào)父分支是接受變動(dòng)的分支(the branch being merged into),2號(hào)父分支是作為變動(dòng)來(lái)源的分支(the branch being merged from)。
實(shí)踐案例
自動(dòng)提交
如果沒(méi)有出現(xiàn)沖突,該命令將自動(dòng)提交。
git cherry-pick <commit_id>當(dāng)cherry-pick時(shí),沒(méi)有成功自動(dòng)提交,這說(shuō)明存在沖突,因此首先需要解決沖突,解決沖突后需要git commit手動(dòng)進(jìn)行提交;
或者git add .后直接使用git cherry-pick --continue繼續(xù)。
不自動(dòng)提交
參數(shù) -n,–no-commit
只更新工作區(qū)和暫存區(qū),不產(chǎn)生新的提交。
增加額外說(shuō)明信息
git cherry-pick -x <commit_id>在原來(lái)的提交信息下,增加一行額外說(shuō)明信息(cherry picked from commit …),用來(lái)說(shuō)明該次commit是從哪里cherry-pick的。
如果是從自己的私人分支之間做這個(gè)操作,就不要使用這個(gè),這樣的信息是無(wú)用的。
如果是cherry-pick別的同事的提交,可以使用這個(gè)參數(shù),這個(gè)額外信息將非常有用。
重新編輯提交信息
如果想要在cherry-pick后重新編輯提交信息,則使用git cherry-pick -e命令
git cherry-pick -e <commit_id>有沖突的情況
如果在執(zhí)行g(shù)it cherry-pick時(shí)遇到?jīng)_突,一般會(huì)有下面的幾種提示:
git cherry-pick --continue git cherry-pick --quit git cherry-pick --abort如果要繼續(xù)cherry-pick,則首先需要解決沖突,通過(guò)git add .將文件標(biāo)記為已解決,然后可以使用git cherry-pick --continue命令,繼續(xù)進(jìn)行cherry-pick操作。
如果要中斷這次cherry-pick,則使用git cherry-pick --quit,這種情況下當(dāng)前分支中未沖突的內(nèi)容狀態(tài)將為modified,
如果要取消這次cherry-pick,則使用git cherry-pick --abort,這種情況下當(dāng)前分支恢復(fù)到cherry-pick前的狀態(tài),沒(méi)有改變。
cherry-pick分支
git cherry-pick <branchname>如果在git cherry-pick后加一個(gè)分支名,則表示將該分支最近一次提交,轉(zhuǎn)移到當(dāng)前分支。
一次pick連續(xù)的多個(gè)提交
語(yǔ)法如下:
git cherry-pick <commit_id_0>..<commit_id_n>中間的兩個(gè)點(diǎn),表示把兩個(gè)commit區(qū)間的所有commit都復(fù)制過(guò)去。
注意:
上面的操作,不會(huì)包含第一個(gè)commit_id_0,即只會(huì)復(fù)制(commit_id_1 到 commit_id_n)。
所以使用時(shí),記得算好第一個(gè)commit id。
如果要包含第一個(gè)commit_id_0提交,可以使用下面的語(yǔ)法:
git cherry-pick <commit_id_0>^..<commit_id_n>注意,多了一個(gè)符號(hào)^
轉(zhuǎn)移到另一個(gè)代碼庫(kù)
Cherry pick 也支持轉(zhuǎn)移另一個(gè)代碼庫(kù)的提交,方法是先將該庫(kù)加為遠(yuǎn)程倉(cāng)庫(kù)。
git remote add target git://gitUrl上面命令添加了一個(gè)遠(yuǎn)程倉(cāng)庫(kù)target。
然后,將遠(yuǎn)程代碼抓取到本地。
git fetch target上面命令將遠(yuǎn)程代碼倉(cāng)庫(kù)抓取到本地。
接著,檢查一下要從遠(yuǎn)程倉(cāng)庫(kù)轉(zhuǎn)移的提交,獲取它的哈希值。
git log target/master最后,使用git cherry-pick命令轉(zhuǎn)移提交。
git cherry-pick <commitHash>總結(jié)
以上是生活随笔為你收集整理的git高级特性之 - cherry-pick的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【VBA编程】Sub过程
- 下一篇: 【CSDN|每日一练】小艺的英文名