cherry-pick 能幹啥?
cherry-pick 的翻譯是擇優挑選,使用git cherry-pick指令,可以選擇将現有的一個或者多個送出的修改引入目前内容。
cherry-pick應用場景
假設你現在正在開發一個項目,有一個功能分支 feature,開發分支 develop。 feature 有3個送出,分别是 A ,B ,C 。develop 分支隻想加入 C 功能, 此時合并操作無法滿足,因為直接合并 feature,會将3個送出都合并上,我想合并就隻有 C,不要 A,B。
此時就需要挑櫻桃大法–cherry pick!
cherry-pick使用:
指令方式:
- 切換到 develop 分支。
- 通過 git log feature,找到 C 的 SHA1 值。
- 通過 git cherry-pick <C的SHA1> ,将 C 的修改内容合并到目前内容分支 develop 中。
- 若無沖突,過程就已經完成了。如果有沖突,按正常沖突解決流程即可。

Idea菜單方式
我目前的代碼分支是2198,目标上線分支是2243。後面2243的代碼review後會合并都hotfix分支上。
- 切換分支到目标分支2243上
- 打開Versin Control面闆
- 在版本控制台點開Log标簽
- 修改分支為要cherry pick的分支
- 點選最後一個按鈕,可以把已經合并過來的送出置灰。這一步可選
- 在下面選擇要cherry pick的送出,按住ctrl鍵選多條,然後點選倒數第二個按鈕進行cherry pick
- 接下來IDEA會依次把每一次送出彈出來讓你寫送出消息(使用預設的就行)。前面選了多條就會彈多次,是以不要急。
- 最後把送出的代碼Push掉就好了。
cherry-pick VS merge
從上面簡單的小例子上看,我想,小夥伴們,都應該已經對 merge 和 cherry-pick 有了大概的區分,這裡做下對比,讓大家有個清晰明确的掌握,防止似是而非,以後誤操作。
- git merge :将兩個送出曆史合并。
- git cherry-pick:将送出對應的内容合并。
這裡,非常需要明确的一點,commit 代表的是修改!
例中,送出 C 的内容,就是對比 B 上面做的修改,可能是建立了一個檔案,或者修改了一個詞語。那麼 C 内容就是一個檔案的添加,和一個詞語的修改。
以送出 C 為結束點的送出曆史,實際内容是送出 C 和 C 之前所有的修改。
- cherry-pick 操作的對象就是 commit。
- merge 操作的對象就是 commit history。
是以,使用的時候,你要知道,你想要的什麼。
cherry-pick其他指令
git cherry-pick <commits>
挑選多個送出合并,送出之間用空格相隔。
例如,
git cherry-pick 4d2951 e4cdff9
git cherry-pick <start-commit>..<end-commit>
挑選一個範圍的多個送出合并,但是這個文法對應操作差別是左開右閉,不包含start-commit。另外要注意兩個commit 之間要求有連續關系的,并且前者要在後者之前,順序不能颠倒。
git cherry-pick <start-commit>^..<end-commit>
這個和git cherry-pick <start-commit>..<end-commit>一樣,差別就是加了一個 ^
符号,就變成閉區間了,包含 start-commit。
git cherry-pick <branch name>
挑選 branch 最頂端的送出
git cherry-pick --continue
繼續下個操作
git cherry-pick --quit
退出
git cherry-pick --abort
停止本次操作
以上是關于 cherry-pick 操作控制指令,當 cherry-pick 多個送出時,假設遇到沖突,--continue繼續進行下個,--quit結束 cherry-pick 操作,但是不會影響沖突之前多個送出中已經成功的,--abort直接打回原形,回到 cherry-pick 前的狀态,包括多個送出中已經成功的。