git··2 min read

Git

Cherry Pick

git cherry-pick 指令用於將其他分支的一個或多個指定 commit 合併到目前的分支,不需要合併整個分支。

什麼時候會用到?

場景一:hotfix 需要同步到其他分支

你在 main 上修了一個緊急 bug(commit abc123),但 develop 分支也需要這個修復,不想整個 merge,就可以用 cherry-pick 只把那一個 commit 搬過去。

場景二:從廢棄分支救出某個功能

某個功能分支因為方向改變被放棄了,但裡面有一兩個 commit 是獨立且有用的,可以用 cherry-pick 把它們挑出來。

場景三:整理 commit 到 release 分支

只想把 develop 上已驗證的特定 commit 放進 release,而不是全部合併進去。


基本用法

Step 1:在來源分支找到目標 commit 的雜湊值(Hash)

git checkout feature-branch
git log --oneline

輸出範例:

abc1234 fix: 修正登入驗證邏輯
def5678 feat: 新增使用者頭像上傳

Step 2:切換到目標分支,執行 cherry-pick

git checkout main
git cherry-pick abc1234

成功後,該 commit 會被複製到 main,產生一個新的 commit(hash 不同,但內容相同)。


一次 cherry-pick 多個 commit

方法一:列出多個 hash

git cherry-pick abc1234 def5678 ghi9012

方法二:使用範圍語法 A..B

cherry-pick commit-A 之後到 commit-B 之間的所有 commit(不包含 A,包含 B):

git cherry-pick abc1234..ghi9012

常用選項

--no-commit:只套用變更,不自動 commit

適合需要先檢查或合併多個變更再一起 commit 的情況:

git cherry-pick abc1234 --no-commit
# 確認變更後手動 commit
git commit -m "chore: apply selected fixes"

--edit:套用後開啟編輯器修改 commit message

git cherry-pick abc1234 --edit

處理衝突

cherry-pick 時如果遇到衝突,Git 會暫停並提示你手動解決:

# 1. 解決衝突後,標記為已解決
git add <衝突的檔>

# 2. 繼續 cherry-pick
git cherry-pick --continue

# 或者放棄這次 cherry-pick,回到執行前的狀態
git cherry-pick --abort

注意事項

  • cherry-pick 後產生的 commit hash 會不同,但內容相同,原始 commit 的作者資訊會保留。
  • 頻繁使用 cherry-pick 可能導致重複 commit,後續 merge 時產生衝突,建議只在明確需要的場景使用。
  • 使用 ForkGitLensSourceTree 等圖形化工具能更直覺地找到 commit hash 並執行 cherry-pick。