關於 cherry-pick 時機與常見誤區
Git Git。心得

前言
在還沒有實際遇到分支管理問題之前,其實很少用到 cherry-pick,第一次真正使用到它,是在剛入職一段時間處理 hotfix 的時候。
按照正常流程,hotfix 應該要從 master 開 branch,修完之後合回 master,再 sync 回 release。
但那次我一不小心從 release 開出了 hotfix,修完之後合回 release 才發現我開錯了,如果再合進去前至少還能 rebase。所以這時候就遇到了一個問題:
- 如果直接把 hotfix 分支合進 master,會把 release 上一些不必要的變更帶進去。
- 但如果只需要那個 bugfix,就得「挑」出來。
所以最後就是使用 cherry-pick,把那個 commit 提交所做的變更引入 master(會在 master 產生一個新的提交)。
最後,為了避免之後 release 之後需要進 master 發生衝突,所以還需要再把 master 的更新同步回 release。
cherry-pick 雖然很方便,能快速解決當下需求。
但它只是權宜之計,真正的解法還是要維持分支策略的正確性,避免不必要的衝突。
cherry-pick 由來
「cherry-pick」這個詞其實來自農業隱喻。
在農場裡採櫻桃時,你不會把整棵樹的果實都摘下來,而是挑選成熟、好吃的櫻桃。
Git 的設計者 Linus Torvalds 借用這個比喻來形容:
- 你不需要把一個分支的所有 commit 都合併過來(那可能會帶來許多不必要的變更),
- 你只挑選「那幾顆有用的 commit」帶到目標分支。
因此才叫 cherry-pick。
cherry-pick 的常見誤區
誤區一:把 cherry-pick 當成日常分支同步手段
很多人會習慣用 cherry-pick 把某些 commit 一直「搬來搬去」,覺得這樣可以避免不必要的變更。
但這麼做會造成:
- commit 歷史混亂:同一個修正會在不同分支生成多個不同的 commit(因為 hash 不一樣)。
- 後續合併衝突更難解:當你最終還是要合併分支時,Git 會認不出那是同一個修正,容易重複套用或衝突。
正確的做法是:
- 如果是臨時 bug 熱修(hotfix),用 cherry-pick 是完全沒問題且正確的。
- 如果是日常同步,應該使用 merge 或 rebase,保持分支間的一致性。
誤區二:以為 cherry-pick 就是 rebase
這是新手最容易混淆的地方。雖然兩者都會「重新套用 commit」,但概念完全不同:
-
cherry-pick
- 針對單一(或一組)commit。
- 適合「我只要這個修正,不要整個分支」。
- 套用後會產生新的 commit hash。
-
rebase
- 是把整個分支的一系列 commit「搬到」另一個分支上。
- 適合「我要保持分支歷史線性,完整移動一段提交」。
- 也會產生新的 commit hash,但會保留 commit 順序。