1.背景/場(chǎng)景
正在開(kāi)發(fā)一個(gè)新功能腮考,從master
拉取了一個(gè)新的分支dev-v1-XXX
桥爽。
現(xiàn)在項(xiàng)目有三個(gè)分支:
-
master
主分支 -
fat
測(cè)試環(huán)境分支 -
dev-v1-XXX
我的開(kāi)發(fā)分支
開(kāi)開(kāi)心心的完成了功能肥矢,將功能代碼合并到了fat
分支提交測(cè)試
這時(shí)候突然想起來(lái)還有幾個(gè)小問(wèn)題沒(méi)改,然后忘記切回自己的開(kāi)發(fā)分支 , 直接在fat
分支修改后Commit&Push
測(cè)試結(jié)束后要發(fā)布新功能认臊,可是突然想起來(lái)代碼一部分在dev-v1-XXX
分支,一部分在fat
分支
怎么辦扳炬?
- 直接把
fat
和dev-v1-XXX
都合入master
(fat
還有其他同學(xué)的不能發(fā)布的代碼) - 把
fat
中的修改手動(dòng)copy過(guò)來(lái)(太麻煩了,簡(jiǎn)直相當(dāng)于重寫(xiě))
我們本章的主角git cherry-pick <commit>
該出手了蝙眶。
2.git cherry-pick <commit>
簡(jiǎn)介
git cherry-pick <commit>
將指定的提交<commit>
凰萨,應(yīng)用于當(dāng)前分支。會(huì)在當(dāng)前分支產(chǎn)生一個(gè)新的提交械馆,新提交的<commit>
與原先不同胖眷。
語(yǔ)法
git cherry-pick [--edit] [-n] [-m parent-number] [-s] [-x] [--ff] [-S[<keyid>]] <commit>…
git cherry-pick (--continue | --skip | --abort | --quit)
使用
## 查找提交的commit id 例如: '7d069483151480153c64544854c3e03b12fa352b'
git log
## 切換到要合入的分支
git checkout dev-v1-XXX
## 合入一個(gè)提交 git cherry-pick <commit>
git cherry-pick 7d069483151480153c64544854c3e03b12fa352b
## 合入多個(gè)提交 git cherry-pick <commit> <commit>
git cherry-pick 7d069483 12fa352b
參數(shù)
-e
,--edit
允許在提交之前編輯提交消息霹崎。
-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
操作過(guò)程中發(fā)生代碼沖突奖恰,Cherry pick 會(huì)停下來(lái)吊趾,讓用戶決定如何繼續(xù)操作
- 解決沖突宛裕,繼續(xù)合入
用戶解決代碼沖突后,將修改的文件重新加入暫存區(qū)(git add .
)然后執(zhí)行git cherry-pick --continue
繼續(xù)合入操作 - 跳過(guò)沖突论泛,繼續(xù)合入其他提交
執(zhí)行git cherry-pick --skip
- 放棄合入续滋,回退到操作前
執(zhí)行git cherry-pick --abort
- 退出合入,不回退到操作前
執(zhí)行git cherry-pick --quit