[Git] Cherry-Pick 使用場景

PC Chen
程式乾貨
Published in
6 min readSep 2, 2021

第一次聽到「cherry-pick」這個詞,是有次跟後端同事討論 db schema ,那時請他有個欄位需要打索引,他說:「這樣好像有點麻煩,因為現在剛好要上版,你的需求做完我可能要cherry-pick一下」。 當下還以為是後端自己的術語XD,之後查了才發現也是 git 的重要功能~剛好最近在開發一些小專案時有用到,就分享一下使用心得吧~

使用時機

cherry-pick顧名思義就是只 撿取 想要的東西(在git flow中就是commit),放到目前分支上。一般來說,整體開發會有一條穩定版本(master 或 release),開發者再開其他分支(dev)做修改後、合併。但有時會突然來個臨時功能需要修復或新增(就像我對後端同學提需求一樣),這個時候又不想把整個分支dev合併進master時,就可以使用cherry-pick,只挑自己想要的commit合併到master就好囉。

程式實作

首先

建立一個資料夾:test_cherrypick,接著在終端機 $ git init 讓資料夾被git所版本控管:

$ cd test_cherrypick
$ git init

並且在master第一個commit: 新增 test.py,接著第二個commit: 在 test.py 新增兩個 func1, func2,藉此模擬開發的過程。

first & second commit on Master
主程式 test.py

切分支作開發

現在因為要新增一些功能,所以我切出一條 dev 的分支,在上面開始做一些開發的動作:
1. 新增 func3
2. 新增 func4
3. 新增 readme.md 文件,並加註說明
4. 新增 hot_fix function

develop commit on barnch Dev
主程式 test.py
文件 readme.md

接著

主管突然說怎麼穩定版本master裡面沒有readme,使用者不知如何執行?還好其實我已經寫好了readme,只是還沒有把 dev 合併到 master 而已,但我還在開發其他功能,我不想要把整個dev都合併到master裏頭,這時我就可以用 cherry-pick~

先來看看線圖,可以看出我只想要 dev 上加入 readme 的這個 commit,先複製下他的 commit_id: 49a43bf

找到我們想要撿取的 commit_id

接著切換到 master 上,輸入這個神奇的指令,就成功了:

$ git checkout master
$ git cherry-pick 49a43bf
成功撿取了我想要的 commit

狀況題

讓我們倒帶回去一下~
假設主管的臨時需求變成是 hot_fix 這個功能很重要,要趕快加上去,這個時候我們要cherry-pick 這個 a1e07d5 有辦法做到嗎?

想要這個緊急功能 hot_fix

一樣來試試

我們試著輸入指令 $ git cherry-pick a1e07d5 ,結果發現不太對,怎麼發生衝突了?

cherry-pick conflicts

這邊其實是 cherry-pick 的小眉角,雖然直覺上我們是直接把我們要的commit_id接上master後面,我們的master沒有任何的變動,照理來說可以完美接上才對!? 如果我們細看 commit_id:a1e07d5 的內容,會發現他是基於 parent commit: 49a43bf 來做修改的,而parent:49a43bf又是基於 parent commit: 5a32202 來做修改的。

5a32202 中是有func4這一行的,但是master裡面並沒有func4這一行,git不知道到底要不要保留func3這一行,所以就跳衝突給我們了。

parent commit: 5a32202 有 func4()

解法

解法1. 直接照平常解衝突的方式

進去發生衝突的檔案 test.py

修衝突前 v.s 修完後

修完後,再依序 $ git add$ git commit$ git cherry-pick --continue 就完成了:

解法2. (較不建議)

使用指令 $ git cherry-pick -Xtheirs {commit_id}

這個方法會把前面parent commit 的 function都一起加進來,在我的範例中因為我在主程式裡沒有運行func3 func4所以影響不大,但如果這些parent commit是有把func3 func4放到主程式裡call的話,那就有影響了! 所以一般來說還是建議遇到衝突就手動修吧!

--

--

PC Chen
程式乾貨

喜歡接觸與動手實作各種軟體技術的後端數據工程師 A data- backend engineer who is enthusiastic in learning and implementing any techniques in software engineering.