這是一張有關標題為 在 Git 中進行挑選提交 的圖片

在 Git 中進行挑選提交

學習如何使用挑選來選擇性並套用已存在的提交。

什麼是挑選?

挑選(cherry-pick)是一種從一個分支中選擇特定提交並將其應用到另一個分支的方法。在兩個不同的開發者分別在 A 和 B 兩個分支上獨立開發的情況下,假設 A 分支上提交了一個重要的 Bug 修正。B 分支可以透過挑選該提交來套用這個 Bug 修正。

相較於將 B 分支變基到 A 分支上的做法,挑選的目的是單純套用單一或數筆提交,而不是整個分支的合併或重整。

挑選現有提交

使用 VS Code

挑選是 Git 中相對簡單的部分。在當前分支上對著想要的提交右鍵,選擇 Cherry Pick... 即可。

當前分支狀態 右鍵 → cherry pick 確認 Cherry pick Cherry pick 完畢

使用指令

當前的分支狀態,注意提交 ID 的部分:

分支狀態

目前在 CP 分支上的提交是 52a310a7,如果只想挑選 2f01e37,在指令中輸入git cherry-pick 2f01e37

1
2
3
4
5
git cherry-pick 2f01e37

[CP 75dc0b3] 修正 file.txt
 Date: Thu Jun 20 13:19:09 2024 +0800
 1 file changed, 1 insertion(+), 1 deletion(-)

同理,如果要挑選連續的範圍,記住頭尾的提交 ID,並輸入:

1
git cherry-pick 頭^..尾

以下是範例,挑選從 5d59 到 b03a 之間的提交(包含頭尾):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
git cherry-pick 5d59^..b03a

[CP 6b21176] 新增 b.txt
 Date: Thu Jun 20 13:15:02 2024 +0800
 1 file changed, 1 insertion(+)
 create mode 100644 b.txt
[CP 0b37faa] 新增 c.txt
 Date: Thu Jun 20 13:15:08 2024 +0800
 1 file changed, 1 insertion(+)
 create mode 100644 c.txt

執行上面的結果,其最終的分支狀態為:

最後的分支結果

如果途中遇到衝突、需要手動解決。或是透過 git cherry-pick --abort 進行終止 cherry-pick 的行為。這部分只能透過指令。

挑選特定檔案的變更

在 Git 中,cherry-pick 命令僅能挑選整個提交,而無法直接挑選某個特定檔案的變更。但如果只想挑出某個提交或分支中的特定檔案,可以使用 checkout 命令來達成這個目標。

1
2
3
4
# checkout 某分支下的某個檔案
git cherryout BRANCH_NAME FILE_PATH
# 或是 checkout 某 提交底下的某個檔案
git cherryout COMMIT_SHA FILE_PATH

如下圖所示,目前所在的 CP 分支位於提交 ID 52a310a7,我們可以透過 checkout 命令,取得提交 ID 為 d616aa83 (WITH_ANOTHER_FIX_ALL) 提交下的 file.txt 檔案:

WITH_ANOTHER_FIX_ALL 包含了多個檔案的修改

1
2
3
git checkout d616 file.txt

從 8ddf008 更新了 1 個路徑

此時,檔案會被放置在暫存區內,然後可以透過 VS Code 進行提交操作:

輸入內容後提交

最終的分支結果如下圖所示,其中提交 ID 為 223cf241File.txt_已修復 包含了「修正 file.txt」與「WITH_ANOTHER_FIX_ALL」的變更。這是一個在簡化和合併提交時相當常見的技巧,通過將不同提交中的變更集中到一個文件中,可以更有效地管理和整合代碼庫中的改動。

最終的分支結果

總結

使用挑選指令,我們可以在不同的分支間複製提交至當前分支。隨著挑選次數的增加,分支結構會變得越來越複雜且難以維護。

適時地利用變基或合併操作,能夠簡化分支的複雜度,尤其是在處理如最後案例中,包含多個檔案修改的提交時,合併會更容易遇到檔案衝突,對於專案不夠熟悉的新手來說維護起來會非常困難。

參考文獻

  1. Git - git-cherry-pick Documentation
主題 Stack 由 Jimmy 設計