iT邦幫忙

2025 iThome 鐵人賽

DAY 24
0
Modern Web

Git 起來!每日一招學起來系列 第 24

Day 24:git cherry-pick —— 挑選你想要的歷史

  • 分享至 

  • xImage
  •  

前面我們聊過 分支、合併、rebase,也學會查看 commit 歷史(git log)。

今天,我們要介紹一個實用但常被忽略的指令:git cherry-pick

它是把歷史中你想要的 commit,搬到目前分支,就像從櫻桃樹上挑你喜歡的果子 🍒。


git cherry-pick 是什麼?

簡單說:

從其他分支或歷史 commit,挑選一個或多個 commit,應用到你目前所在的分支。

使用場景

  1. 你在 feature 分支修了一個 bug,但現在 main 分支也需要這個修復。
  2. 你只想拿別人的特定功能,而不是整個分支歷史。
  3. 專案中某些 commit 很重要,但合併整個分支會帶來其他不想要的修改。

簡單來說,cherry-pick 讓你自由選擇 commit,不必整個搬家。


基本用法

假設你想把 commit a1b2c3d 的修改,搬到目前分支:

git cherry-pick a1b2c3d
  • Git 會自動產生新的 commit,把這個修改加到當前分支。
  • 原 commit 的 hash 不會改變,但會生成新的 commit hash。

如果想一次挑多個 commit:

git cherry-pick a1b2c3d e4f5g6h i7j8k9l
  • Git 會依序套用每個 commit。
  • 遇到衝突,需要手動解決,然後用 git cherry-pick --continue 繼續。

進階技巧

挑整個範圍

git cherry-pick a1b2c3d^..i7j8k9l
  • ^ 表示從前一個 commit 開始
  • .. 表示到結尾 commit

不產生 commit,先暫存

git cherry-pick -n a1b2c3d
  • -n-no-commit:只把修改套用到暫存區,不會自動 commit
  • 可以合併多個 cherry-pick 再一次 commit

中斷 cherry-pick 或取消

git cherry-pick --abort
  • 遇到衝突不想處理,恢復到 cherry-pick 前的狀態

常見衝突與解法

Cherry-pick 也可能碰到衝突,尤其是原本分支和目標分支同一檔案有不同修改。

處理流程:

  1. git status 查看衝突檔案
  2. 編輯檔案解決衝突
  3. git add <file> 標記已解決
  4. git cherry-pick --continue 繼續套用

如果不想要這個 cherry-pick,直接:git cherry-pick --abort


注意事項

  • cherry-pick 會產生新的 commit hash,不會「直接複製原來的 hash」。
  • 如果頻繁 cherry-pick 同一個 commit,可能會造成歷史重複或混亂。
  • 適合少量精選 commit,大量變更建議考慮 merge 或 rebase。

小挑戰 💪

  1. 創建兩個分支 featuremain
  2. feature 分支新增一個檔案,commit 後記下 hash。
  3. 切換到 main 分支,用 git cherry-pick 將這個 commit 套用到 main
  4. 嘗試使用 git cherry-pick -n 合併多個 commit 再一次 commit。
  5. 故意製造衝突,練習 --continue--abort

小結

今天我們學到:

  • git cherry-pick 可以 挑選特定 commit
  • 適合小範圍修改、搬特定功能,不想整個分支都合併。
  • 搭配 -n 可以更自由地組合多個 commit。
  • 碰到衝突時,記得先解決再 -continue,或用 -abort 放棄

掌握 cherry-pick,讓你在 Git 世界裡 精準調度每個 commit,想挑什麼就挑什麼


上一篇
Day 23:merge 進階 + conflict 解法 —— 分支匯流高手養成記
系列文
Git 起來!每日一招學起來24
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言