iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 15
2
Software Development

用樂高玩轉 GIT 版本控制系列 第 15

Day 15 - 你那招很厲害,我不要一整套,可以只要一招嗎?git cherry-pick

  • 分享至 

  • twitterImage
  •  

在樂高手冊上,如 Day 14 上的內容,如果劇情變更成,A 版作者覺得 B 版作者的「步驟 1 (B1):變更內容,在橫條基板右上角放上一格綠色樂高」很好很強大,那,能不能直接拿來用呢?一般來說,是不是只要作者願意同意,就可以直接抄來自己的手冊上使用了呢。

同樣的劇情,在 GIT 也可以有類似的劇情發生,在 Day 14 的內容中,提到 git rebase 的概念「換一個基點,再做一次同樣的改變」,自己的分支上有幾個步驟,在目標的分支上,就作幾次相同的步驟。如果以同樣的例子說明,現在在 banana 分支上,我只想要 apple 分支上的「add apple 2」這個步驟呢?

只取一個步驟 git cherry-pick

目前 SourceTree 的線圖,個別有兩個 commit

如上面所提到的問題,現在在 banana 分支上,如果我只想要 apple 分支上,那個註解說名為「add apple 2」HASH Code 對應為 660033a 的步驟,可以嗎?答案是可以的,在 GIT 版本控制系統上,就提供了這樣一個指令,名為 git cherry-pick

如上面的例子,可以執行 git cherry-pick 660033a,執行後如下畫面:

CLI 執行 cherry-pick 畫面

在 SourceTree 的線圖上:

SourceTree 上的線圖畫面

可以發現畫面上 660033a 所對應的 git 變更,在 banana 分支上,再次實作了一次,並且產生了新的 HASH Code b7603d3

值得一提的,如果同一個步驟在 SourceTree 上,可以如下動畫,在喜歡的 commit 上面,直接選取,就可以進行 git cherry-pick 挑選了(當然因為 HASH Code 是每次重新計算,因此這次執行與上面透過 CLI 執行產出的 HASH Code 不一樣):

SourceTree cherry-pick

git cherry-pick 可以多挑幾個步驟嗎?

當然是可以的。我們先把上面的例子稍作修改,把 apple 上的分支在增加兩個 commit,修改後的例子如下:

SourceTree 上的線圖增加兩個 commit

在執行 git cherry-pick 的時候,如果要選取 apple 上的 add apple 3 及 add apple 4 這兩個連續的步驟,可以這樣下指令:git cherry-pick 660033a..62dacb9

CLI 對應的指令畫面

這段指令的意思是,我要選取從 660033a 這個 commit 變更之後的變更,直到 62dacb9 的這個變更,因為是之後的變更,所以不包含 660033a 這個 commit 所代表的變化。該 commit 之後的變更,直到目的 commit 這段文字很重要,沒選對 commit 會造成少拉一個 commit。如果是程式碼,那就.....該程式可能就因此無法使用了。

同樣的步驟,在 SourceTree 也可以做連續選取的動作:

SourceTree 多個選取

值得一提的地方是,其實 git rebase 的底層基礎原理也有利用了 git cherry-pick 指令,把要作 rebase 的分支,從基礎點開始,一個一個 git cherry-pick 到目標的分支上;只是 rebase 之後,原本的那個分支,就消失了。

總結

如果以某個樂高步驟「在基板上某個位置安裝一塊樂高積木」,git cherry-pick的概念就是把你的那個變更,也在我這邊變更一次。如果這樣去理解這指令,我覺得會比較好瞭解。

這個指令在一些 GIT 流程,如 GitLab Flow 上會提到,而 GIT 的流程管控,在後面的幾天也會提到,因此在這邊先提過一次。


上一篇
Day 14 - 換個起點再來一次 談 git rebase
下一篇
Day 16 - 把製作步驟歷程整理好讓人更好理解,談 git rebase -i 互動模式
系列文
用樂高玩轉 GIT 版本控制30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言