前篇
 在此之前,我想問一個問題,你是在接觸 Git 多久之後,知道有這個命令的?
我的答案是很久很久之後,這真是一個悲傷的故事。懶,是萬惡之源,此話果然不假。
cherry-pick 能幹啥?
 cherry,中文翻譯是櫻桃,pick, 中文翻譯是採集,挑選。所以,cherry-pick 就是挑選櫻桃,git cherry-pick 就是從你的專案檔案中找出"櫻桃"二字,找到就可以找博主來兌換櫻桃了。
以上是開玩笑,寫部落格呢,幹什麼,正經點!
cherry-pick 的翻譯是擇優挑選,使用git cherry-pick命令,可以選擇將現有的一個或者多個提交的修改引入當前內容。
那麼,什麼情況下會有到這麼不常見的命令呢?
假設你現在正在開發一個專案,有一個功能分支 feature,開發分支 develop。 feature 有3個提交,分別是 A ,B ,C 。develop 分支只想加入 C 功能, 此時合併操作無法滿足,因為直接合併 feature,會將3個提交都合併上,我想合併就衹有 C,不要 A,B。此時就需要挑櫻桃大法–cherry pick!
具體的做法:
切換到 develop 分支。
 透過 git log feature,找到 C 的 SHA1 值。
 透過 git cherry-pick 
 若無衝突,過程就已經完成了。如果有衝突,按正常衝突解決流程即可。
 cherry-pick VS merge, Ready? GO!
 從上面簡單的小範例上看,我想,小夥伴們,都應該已經對 merge 和 cherry-pick 有了大概的區分,這裡做下對比,讓大家有個清晰明確的掌握,防止似是而非,以後誤操作。
 git merge :將兩個提交歷史合併。
 git cherry-pick:將提交對應的內容合併。
這裡,非常需要明確的一點,commit 代表的是修改!
例中,提交 C 的內容,就是對比 B 上面做的修改,可能是建立了一個檔案,或者修改了一個詞語。那麼 C 內容就是一個檔案的新增,和一個詞語的修改。
以提交 C 為結束點的提交歷史,實際內容是提交 C 和 C 之前所有的修改。
cherry-pick 操作的物件就是 commit。
 merge 操作的物件就是 commit history。
所以,使用的時候,你要知道,你想要的什麼。
博主邀請你參加挑櫻桃遊戲
 光說不練假把式,現在寫個小 demo 測試一下。
建立一個空資料夾 GitDemo,git init初始化。
 隨便建立一個檔案,完成初次提交,建立 master 分支。
 建立並切換 develop 分支,建立個提交,每一個提交中建立一個檔案,方便測試。
 具體命令如下:
// 切換到GitDemo目錄下,並初始化Git
 cd .../GitDemo  
 git init  
//建立初次提交,建立 master 分支
 touch cherry-pick.txt
 git add .
 git commit -m '建立cherry-pick檔案,初次提交'  
 //建立並切換到 develop 分支,建立提交「櫻桃1號」
 git checkout -b develop
 touch 櫻桃1號.txt
 git add .
 git commit -m "建立櫻桃1號檔案"
 //建立提交「櫻桃2號」
 touch 櫻桃2號.txt
 git add .
 git commit -m "建立櫻桃2號檔案"
//建立提交「櫻桃3號」
 touch 櫻桃3號.txt
 git add .
 git commit -m "建立櫻桃3號檔案"
1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 以上,測試場景構建完畢。現在用 git log develop 檢視 develop 的提交歷史如下:
現在,仔細瞅瞅,你最喜歡幾號櫻桃,喜歡哪個,就挑哪個。我喜歡3號,從上圖看到3號的 SHA1 值是90279a36a8972034e922b65598adfc0c3e13679b,使用前幾位就足夠了。
//切換到 master 分支
 git checkout master
 //挑選3號櫻桃
 git cherry-pick 90279a36
1
 2
 3
 4
 5
挑選成功,透過 ls 命令,看到成功加入櫻桃3號.txt。
挑櫻桃遊戲成功!
另外,需要說明的是,cherry-pick 到 master 的櫻桃3號,事實上不是真的 3 號,是 3 號的複製品, 兩者的 SHA1 值是不同的,由此可確認這是兩個提交。
了解更多的 cherry-pick
 理解 cherry-pick 操作的本質,之後,再看其他的命令,就毫無壓力了。全部命令詳看官方檔案,這裡我給出幾個比較常用的:
git cherry-pick 
1
 2
 挑選多個提交合併,提交之間用空白相隔。例如,想挑選1號和3號的,就可以用git cherry-pick 4d2951 e4cdff9命令一步到位了。
git cherry-pick 
1
 2
 挑選一個範圍的多個提交合併,但是這個語法對應操作區別是左開右閉,不包含start-commit。另外要注意兩個commit 之間要求有連續關係的,並且前者要在後者之前,順序不能顛倒。
git cherry-pick 
1
 2
 這個和上面一樣,區別就是加了一個^符號,就變成閉區間了,包含 start-commit。
git cherry-pick 
 1
 挑選 branch 最頂端的提交。例如挑選 3 號櫻桃可以用git cherry-pick develop。
git cherry-pick --continue  //繼續下個操作
 git cherry-pick --quit //退出
 git cherry-pick --abort //停止本次操作
1
 2
 3
 4
 以上是關於 cherry-pick 操作控制命令,當 cherry-pick 多個提交時,假設遇到衝突,--continue繼續進行下個,--quit結束 cherry-pick 操作,但是不會影響衝突之前多個提交中已經成功的,--abort直接打回原形,回到 cherry-pick 前的狀態,包括多個提交中已經成功的。
尾篇
 對於這個命令來說,理解 commit 的本質是修改很關鍵。好了,下篇部落格見~,這個3月要將當初計劃的 Git 系列部落格補完,Fighting!
 ————————————————
 版權宣告:本文為CSDN博主「DRPrincess」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本宣告。
 原文連結:https://blog.csdn.net/qq_32452623/article/details/79449534