Git Cherry-Pick



命令 git cherry-pick 允許您選擇並將特定提交從一個分支應用到另一個分支。

透過應用一個或多個先前提交所做的修改,git cherry-pick 命令為每個提交生成一個新的提交。

在開始之前,工作樹需要是乾淨的(沒有來自 HEAD 提交的更改)。

應用更改時

  • 成功的更改會更新受影響路徑的索引和工作樹。

  • 如果無法正確實現更改,則當前分支和 HEAD 保持不變。

  • 生成衝突的提交由 CHERRY_PICK_HEAD 引用指示。

  • 衝突路徑在工作樹中用衝突標記(<<<<<<<>>>>>>>)標記,並在索引中最多包含三個版本。

  • 除了這些特定更改之外,不會進行其他修改。

用法

當您想要從另一個分支獲取特定的錯誤修復或功能並將其應用到當前分支而無需合併整個分支時,通常會使用 git cherry-pick 命令。

語法

git cherry-pick <commit>…
  • 指定用於 cherry-pick 的提交由 <commit>... 指示。

  • 類似於使用 --no-walk,可以提供提交集,但預設情況下不會進行遍歷。

  • 當指定範圍時,將使用單個修訂版遍歷來處理所有 <commit>... 引數。

選項

git cherry-pick 命令具有以下選項

-e

--edit

git cherry-pick -e <commit>…

git cherry-pick --edit <commit>…
  • 透過在 git cherry-pick 中使用 -e--edit 選項,您可以在完成 cherry-pick 操作之前修改提交訊息。

  • 應用指定提交的更改後,Git 會啟動您的預設文字編輯器進行訊息編輯。

  • 根據已 cherry-pick 的修改,此選項有助於提供更符合上下文或更具描述性的提交訊息。

--cleanup=<mode>

git cherry-pick --cleanup=scissors <commit>…
  • 在將提交訊息傳送到提交過程之前,Git 會根據 --cleanup=<mode> 選項對其進行格式化。

  • 如果 <mode> 設定為 scissors,則 Git 會在衝突期間將 scissors 新增到 MERGE_MSG 中,這使得手動衝突解決更容易。

-x

git cherry-pick -x <commit>…
  • 為了記錄 cherry-pick 的更改並標識其源提交。

    git cherry-pick 中的 -x 選項會將一行 cherry picked from commit …​ 新增到原始提交訊息中。

  • cherry-pick 過程中出現的衝突不包含在此註釋中。

-r

git cherry-pick -r <commit>…
  • 過去,git cherry-pick 中的 -r 選項用於防止提交訊息預設自動新增 cherry picked from commit

  • 根據當前預設設定,此註釋不會預設插入,因此 -r 選項無效,被視為無操作。

-m <parent-number>

--mainline

git cherry-pick -m 1 <commit>…
  • 在 Git cherry-pick 中,-m <parent-number>--mainline <parent-number> 選項指示要作為主線考慮的合併提交的父級。

  • 這使得 Git 可以相對於指定的父級(從 1 開始編號)重放更改,並有助於建立在從合併提交進行 cherry-pick 時應用更改的基礎。

  • 為了確保在 cherry-pick 合併時應用正確的修改來源,此選項對於消除任何疑問至關重要。

-n

--no-commit

git cherry-pick -n <commit>…

git cherry-pick --no-commit <commit>…
  • 帶有 -n--no-commit 選項的 Git cherry-pick 將指定提交的更改應用於工作樹和索引,而不會自動生成提交。

  • 此選項允許針對索引的當前狀態進行 cherry-pick,而不需要它與 HEAD 提交匹配,因此它有助於順序地應用來自多個提交的更改,而無需單獨提交每個更改。

-s

--signoff

git cherry-pick -s <commit>…
  • 使用 -s--signoff 選項時,Git 會在提交訊息的末尾插入 Signed-off-by 尾部。

  • 此尾部通常包含作者的姓名和電子郵件地址,證明作者有權根據專案的許可證要求提交程式碼。

  • 它充當數字簽名,證明貢獻的程式碼是真實的,並且作者已經檢查過它。

-S[<keyid>]

--gpg-sign[=<keyid>]

--no-gpg-sign

  • 可以使用 -S--gpg-sign 選項在 Git 中對提交進行 GPG 簽名。

  • 可以使用可選的 keyid 指定簽名者的身份。

  • 另一方面,--no-gpg-sign 會反轉此行為,它會覆蓋任何先前的提交 GPG 簽名配置。

--ff

git cherry-pick --ff <commit>…
  • 如果當前 HEAD 已經是其直接父級,則 Git 的 cherry-pick 命令中的 --ff 選項允許快速轉發合併到 cherry-pick 的提交。

--abort

git cherry-pick --abort
  • 如果 cherry-pick 過程中遇到衝突,或者您想出於任何其他原因停止操作,則 cherry-pick 過程將被取消。

--quit

git cherry-pick --quit
  • cherry-pick 過程停止,但它保留衝突解決,以便如果您以後想繼續,您可以繼續。

處理合併衝突

如果在 cherry-pick 過程中出現衝突

  • Git 將停止該過程並標記衝突檔案。

  • 手動解決衝突。

  • 解決後,使用

  • git add <resolved-file>
    git cherry-pick --continue
    

Cherry-pick 多個提交

可以使用以下命令一起 cherry-pick 不同的提交

git cherry-pick <commit1>^..<commit2>

也可以使用以下命令 cherry-pick 不連續的提交

git cherry-pick <commit1> <commit2> <commit3>

因此,此命令的目的是將特定提交從一個分支應用到另一個分支,而無需合併整個分支。

廣告