Featured image of post gitcherry-pick 用於特定提交的安全用例Featured image of post gitcherry-pick 用於特定提交的安全用例

gitcherry-pick 用於特定提交的安全用例

了解如何使用 gitcherry-pick 將特定提交變更移植到另一個分支,以及如何安全地解決衝突。

介紹

在團隊開發中,您經常會遇到需要立即將特定錯誤修復從正在進行的功能分支部署到生產分支(main)的情況,而不釋放半完成的功能本身。

合併整個分支會引入未完成的程式碼。

這就是 git cherry-pick 指令派上用場的地方。本文回顧如何安全地將單一提交應用到目標分支、處理執行期間的衝突以及避免常見的歷史陷阱。


1. 什麼是 gitcherry-pick?

git cherry-pick 是一個命令,它從任何分支複製特定提交引入的更改,並將它們作為新提交應用到當前分支的頂端。

常見用例

  • 修補生產: 將開發分支中編寫的關鍵補丁直接應用到穩定分支,而無需等待完整的發布週期。
  • 恢復錯誤分配的提交: 將在錯誤分支上意外進行的提交移至正確的分支(然後重置原始分支)。

2. 挑選的基本步驟

讓我們逐步了解應用單一提交的命令步驟。

第 1 步:識別提交哈希

首先,檢查您的分支歷史記錄以查找要複製的變更的提交雜湊(例如 a1b2c3d)。

git log --oneline

第 2 步:檢查目標分行

切換到要套用變更的分支(例如 main)。

git checkout main

第 3 步:執行 Cherry-Pick 命令

執行指定目標提交哈希的命令:

git cherry-pick a1b2c3d

Git 複製 a1b2c3d 中的更改,並使用原始提交訊息在 main 上建立新提交。

精挑細選多次提交

您可以透過用空格分隔哈希值或指定範圍來挑選一系列提交:

# Cherry-pick multiple individual commits
git cherry-pick a1b2c3d e5f6g7h

# Cherry-pick a range from Commit A to Commit B (A is excluded, B is included)
git cherry-pick A..B

3. 解決挑選過程中的衝突

因為cherry-pick應用補丁差異,所以如果目標分支中圍繞更改的程式碼顯著不同,它將暫停,從而產生合併衝突。

如何解決衝突

  1. 修正衝突標記: 在編輯器中開啟衝突檔案並手動解決重疊的程式碼區塊。
  2. 暫存已解析的檔案:
   git add <filename>
  1. 繼續挑選:
   git cherry-pick --continue

中止行程

如果衝突太複雜或您選擇了錯誤的提交,您可以中止cherry-pick並將工作目錄回到先前的狀態:

git cherry-pick --abort

4. 關鍵規則和最佳實踐

雖然 git cherry-pick 非常方便,但如果過度使用,可能會導致歷史記錄混亂。

  • 避免重複提交追蹤問題: Cherry-picked 提交複製內容,但收到唯一的雜湊值。當您稍後將原始功能分支合併回 main 時,Git 必須解析具有相同變更但不同雜湊值的兩次提交。這可能會導致冗餘的衝突標記。
  • 附加原始提交參考: 在協作分支上進行挑選時,請使用 -x 標誌。這會自動將原始提交雜湊附加到新提交訊息中,從而提供清晰的可追溯性。
  git cherry-pick -x a1b2c3d

輸出訊息詳細資料: (cherry picked from commit a1b2c3d...)

結論

git cherry-pick 是一個強大的工具,用於修補和糾正較小的開發錯誤。然而,它應該被保留作為一種救援機制。對於常規功能發布,請依賴標準合併 (git merge) 或變基 (git rebase) 來保持分支歷史記錄乾淨。