簡體中文 ▾ 主題 ▾ 最新版本 ▾ git-cherry-pick 最後更新於 2.50.0

名稱

git-cherry-pick - 應用由現有提交引入的更改

概要

git cherry-pick [--edit] [-n] [-m <parent-number>] [-s] [-x] [--ff]
		  [-S[<keyid>]] <commit>…​
git cherry-pick (--continue | --skip | --abort | --quit)

描述

給定一個或多個現有提交,應用每個提交引入的更改,併為每個提交記錄一個新提交。這要求您的工作區是乾淨的(沒有 HEAD 提交的修改)。

當如何應用更改不明顯時,會發生以下情況

  1. 當前分支和 HEAD 指標保持在最後成功建立的提交。

  2. CHERRY_PICK_HEAD ref 被設定為指向引入難以應用的更改的提交。

  3. 已乾淨應用更改的路徑將在索引檔案和您的工作區中都得到更新。

  4. 對於衝突路徑,索引檔案會記錄多達三個版本,如 git-merge[1] 的“真實合併”部分所述。工作區檔案將包含用常規衝突標記 <<<<<<<>>>>>>> 括起來的衝突描述。

  5. 不進行其他修改。

有關解決此類衝突的提示,請參閱 git-merge[1]

選項

<commit>…​

要 cherry-pick 的提交。有關拼寫提交的更完整列表,請參閱 gitrevisions[7]。可以傳遞提交集,但預設不進行遍歷,就像指定了 --no-walk 選項一樣,請參閱 git-rev-list[1]。請注意,指定範圍會將所有 <commit>…​ 引數傳遞給單個修訂遍歷(請參閱後面使用 *maint master..next* 的示例)。

-e
--edit

使用此選項,*git cherry-pick* 將允許您在提交前編輯提交訊息。

--cleanup=<mode>

此選項決定在將提交訊息傳遞給提交機制之前如何進行清理。有關更多詳細資訊,請參閱 git-commit[1]。特別是,如果為 *<mode>* 指定值為 scissors,在發生衝突時,剪刀會附加到 MERGE_MSG 之前進行傳遞。

-x

在記錄提交時,會在原始提交訊息中附加一行,說明“(cherry picked from commit …​)”以指示此更改是從哪個提交 cherry-pick 而來的。這僅適用於沒有衝突的 cherry-pick。如果您正在從私有分支 cherry-pick,請不要使用此選項,因為資訊對接收者無用。另一方面,如果您正在兩個公開可見的分支之間 cherry-pick(例如,將一個修復從開發分支 backport 到舊版本的維護分支),新增此資訊可能會很有用。

-r

以前,該命令預設為執行上面描述的 -x,而 -r 用於停用它。現在預設不執行 -x,因此此選項是無操作。

-m <parent-number>
--mainline <parent-number>

通常您無法 cherry-pick 合併,因為您不知道應該將合併的哪一側視為主線。此選項指定主線的父項編號(從 1 開始),並允許 cherry-pick 相對於指定父項重放更改。

-n
--no-commit

通常,該命令會自動建立一系列提交。此標誌將 cherry-pick 每個命名提交所需的更改應用於您的工作區和索引,而不進行任何提交。此外,當使用此選項時,您的索引不必與 HEAD 提交匹配。cherry-pick 是針對您索引的初始狀態進行的。

這在連續 cherry-pick 多個提交的效果到您的索引時很有用。

-s
--signoff

在提交訊息的末尾新增一個 Signed-off-by 尾部。有關更多資訊,請參閱 git-commit[1] 中的 signoff 選項。

-S[<keyid>]
--gpg-sign[=<keyid>]
--no-gpg-sign

GPG 簽名提交。*keyid* 引數是可選的,預設為提交者身份;如果指定,則必須將其緊貼選項,中間無空格。*--no-gpg-sign* 對於抵消 *commit.gpgSign* 配置變數和先前的 *--gpg-sign* 非常有用。

--ff

如果當前 HEAD 與 cherry-pick 的提交的父項相同,則將執行快進到該提交。

--allow-empty

預設情況下,cherry-pick 一個空提交將失敗,表明需要顯式呼叫 git commit --allow-empty。此選項會覆蓋該行為,允許自動在 cherry-pick 中保留空提交。請注意,當 "--ff" 生效時,即使沒有此選項,也會保留滿足“快進”要求的空提交。另請注意,此選項的使用僅保留最初為空的提交(即,提交記錄的樹與其父項相同)。由於先前提交而變為空的提交將導致 cherry-pick 失敗。要強制包含這些提交,請使用 --empty=keep

--allow-empty-message

預設情況下,cherry-pick 一個訊息為空的提交將失敗。此選項會覆蓋該行為,允許 cherry-pick 訊息為空的提交。

--empty=(drop|keep|stop)

如何處理與當前歷史中已存在的更改冗餘的被 cherry-pick 的提交。

drop

該提交將被丟棄。

keep

該提交將被保留。暗含 --allow-empty

stop

cherry-pick 將在應用提交時停止,允許您檢查提交。這是預設行為。

請注意,--empty=drop--empty=stop 僅指定如何處理一個並非最初為空但由於先前提交而變為空的提交。最初為空的提交仍將導致 cherry-pick 失敗,除非指定了 --empty=keep--allow-empty 之一。

--keep-redundant-commits

已棄用的 --empty=keep 同義詞。

--strategy=<strategy>

使用給定的合併策略。應僅使用一次。有關詳細資訊,請參閱 git-merge[1] 中的 MERGE STRATEGIES 部分。

-X<option>
--strategy-option=<option>

將合併策略特定的選項傳遞給合併策略。有關詳細資訊,請參閱 git-merge[1]

--rerere-autoupdate
--no-rerere-autoupdate

在 rerere 機制使用記錄的衝突解決來更新工作樹中的檔案後,允許它也用解決結果更新索引。--no-rerere-autoupdate 是一個很好的方式來雙重檢查 rerere 所做的操作,並在使用單獨的 git add 將結果提交到索引之前,捕獲潛在的錯誤合併。

SEQUENCER 子命令

--continue

使用 .git/sequencer 中的資訊繼續正在進行的操作。可用於在解決失敗的 cherry-pick 或 revert 的衝突後繼續。

--skip

跳過當前提交,並繼續處理序列的其餘部分。

--quit

忘記當前正在進行的操作。可用於在失敗的 cherry-pick 或 revert 後清除 sequencer 狀態。

--abort

取消操作並返回到 pre-sequence 狀態。

示例

git cherry-pick master

應用 master 分支尖端提交引入的更改,並用此更改建立一個新提交。

git cherry-pick ..master
git cherry-pick ^HEAD master

應用 master 的祖先但不是 HEAD 的所有提交引入的更改,以產生新提交。

git cherry-pick maint next ^master
git cherry-pick maint master..next

應用 maint 或 next 的祖先但不是 master 或其任何祖先的所有提交引入的更改。請注意,後者不意味著 maint 以及 masternext 之間的內容;具體來說,如果 maint 包含在 master 中,則不會使用 maint

git cherry-pick master~4 master~2

應用 master 指向的第五個和第三個最後提交引入的更改,並用這些更改建立 2 個新提交。

git cherry-pick -n master~1 next

將 master 指向的第二個最後提交和 next 指向的最後一個提交引入的更改應用到工作區和索引,但不對這些更改建立任何提交。

git cherry-pick --ff ..next

如果歷史是線性的,並且 HEAD 是 next 的祖先,則更新工作區並將 HEAD 指標前進到與 next 匹配。否則,將 next 中但 HEAD 中不存在的提交引入的更改應用到當前分支,為每個新更改建立一個新提交。

git rev-list --reverse master -- README | git cherry-pick -n --stdin

將 master 分支上修改了 README 的所有提交引入的更改應用到工作區和索引,以便可以檢查結果,並在合適時將其合併為一個新提交。

以下序列嘗試 backport 一個補丁,但由於補丁適用的程式碼已更改太多而失敗,然後再次嘗試,這次更加謹慎地匹配上下文行。

$ git cherry-pick topic^             (1)
$ git diff                           (2)
$ git cherry-pick --abort            (3)
$ git cherry-pick -Xpatience topic^  (4)
  1. 應用 git show topic^ 將顯示的更改。在此示例中,補丁未乾淨應用,因此有關衝突的資訊會寫入索引和工作區,並且不會產生新提交。

  2. 總結要協調的更改

  3. 取消 cherry-pick。換句話說,返回到 cherry-pick 前的狀態,保留您在工作區中的任何本地修改。

  4. 嘗試再次應用 topic^ 引入的更改,花費額外時間避免因錯誤匹配上下文行而導致的錯誤。

另請參閱

GIT

Git[1] 套件的一部分