初學者指南:如何使用 git cherry-pick 挑選特定提交

更新日期: 2024 年 12 月 22 日

本文為 Git 提交拆解案例探討,第 3 篇

  1. 如何將一個分支上的多項功能代碼分離到不同分支
  2. 用導航地圖比喻理解 Git 的 Commit 與 reset 操作邏輯
  3. 初學者指南:如何使用 git cherry-pick 挑選特定提交 👈 所在位置
  4. Git 推送失敗的解決方案:non-fast-forward 問題指南

在軟體開發中,你可能會遇到這樣的場景:某個分支上的一個提交對你來說非常重要,但你不想合併整個分支的歷史,只需要這個提交的變更。

在這種情況下,git cherry-pick 就是你的最佳工具!

本文將以生活中的類比和實例,幫助你理解 git cherry-pick 的作用與使用方式。


什麼是 git cherry-pick

定義

git cherry-pick 是一個 Git 命令,用來挑選特定提交,並將其應用到當前分支

它的作用是從某個提交中提取代碼變更,並作為一個新提交,加入到當前分支。

核心功能

  1. 從指定提交中提取變更。
  2. 將這些變更作為新提交,應用到當前分支。
  3. 僅影響你選定的提交,其他提交不會受到干擾。

git cherry-pick 的生活類比

假設你是一位廚師,有兩本菜譜:

  • 一本是「分支 A」。
  • 一本是「分支 B」。

其中,「分支 A」記錄了一道特別好吃的菜(某個提交),你想把這道菜加入到你的新菜單(當前分支)。你不需要整本菜譜,只要這一道菜的食譜。

git cherry-pick 就像把這個食譜摘抄下來,並加入到你的新菜單中。


使用範例:如何挑選提交

場景

假設你的項目中有兩個分支:

  1. feature 分支:包含最新的開發功能。
  2. main 分支:用於穩定的生產環境。

目前的提交歷史如下:

分支 `feature`
  A---B---C (HEAD)

分支 `main`
  X---Y---Z

你希望把 feature 分支上的提交 B(例如 b123456)加入到 main 分支,而不是合併整個 feature

操作步驟

1. 切換到目標分支

首先,切換到你希望應用提交的分支,例如 main

git switch main

2. 挑選特定提交

使用 git cherry-pick 挑選提交 B(假設哈希值是 b123456):

git cherry-pick b123456

3. 查看結果

現在,main 分支包含了一個新的提交,來自 feature 的提交 B,但有一個新的哈希值:

分支 `main`:<br>  X---Y---Z---B'

注意:這個新的提交在 main 上會有一個不同的哈希值(如 b'),即使內容相同。


git cherry-pick 的常見應用場景

1. 挑選特定功能或修復

當某個分支包含多個提交,但你只需要其中的一部分功能或修復時,可以使用 git cherry-pick

2. 合併熱修復

在修復 Bug 的熱修復分支中,完成了一個重要修復,現在需要將該修復應用到主分支或其他分支。

3. 避免全量合併

如果不需要合併整個分支的歷史,但某個提交非常重要,可以使用 git cherry-pick 選取它。


使用 git cherry-pick 的注意事項

重新生成提交記錄

git cherry-pick 會在當前分支創建一個新的提交,而不是直接拷貝原始提交。因此,新的提交會有不同的哈希值。

處理衝突

如果挑選的提交與當前分支有代碼衝突,Git 會提示你解決衝突。解決衝突後,手動執行以下命令完成操作:

git cherry-pick --continue

避免挑選合併提交

合併提交(merge commit)通常包含多個父提交,處理起來比較複雜,建議避免直接挑選。


總結

git cherry-pick 是一個強大的工具,用於挑選特定提交並將其應用到當前分支。它適合以下場景:

  • 從其他分支提取特定功能或修復。
  • 避免全量合併,保持提交記錄的清晰。
  • 高效處理熱修復或補丁的合併。

如果你需要更深入的解釋或實例,隨時告訴我!

Similar Posts