設定與組態
取得與建立專案
基本快照
分支與合併
分享與更新專案
檢查與比較
修補
除錯
電子郵件
外部系統
伺服器管理
指南
- gitattributes
- 命令列介面規範
- Git 日常使用
- 常見問題 (FAQ)
- 詞彙表
- 掛鉤 (Hooks)
- gitignore
- gitmodules
- 修訂版本 (Revisions)
- 子模組
- 教學
- 工作流程
- 所有指南...
管理
底層命令 (Plumbing Commands)
- 2.55.0 無變更
-
2.54.0
2026-04-20
- 2.50.1 → 2.53.0 無變更
-
2.50.0
2025-06-16
- 2.45.1 → 2.49.1 無變更
-
2.45.0
2024-04-29
- 2.39.4 → 2.44.4 無變更
-
2.39.3
2023-04-17
- 2.38.1 → 2.39.2 無變更
-
2.38.0
2022-10-02
- 2.35.1 → 2.37.7 無變更
-
2.35.0
2022-01-24
- 2.30.1 → 2.34.8 無變更
-
2.30.0
2020-12-27
- 2.27.1 → 2.29.3 無變更
-
2.27.0
2020-06-01
- 2.23.1 → 2.26.3 無變更
-
2.23.0
2019-08-16
- 2.22.1 → 2.22.5 無變更
-
2.22.0
2019-06-07
- 2.21.1 → 2.21.4 無變更
-
2.21.0
2019-02-24
- 2.10.5 → 2.20.5 無變更
-
2.9.5
2017-07-30
- 2.8.6 無變更
-
2.7.6
2017-07-30
-
2.6.7
2017-05-05
- 2.4.12 → 2.5.6 無變更
-
2.3.10
2015-09-28
- 2.1.4 → 2.2.3 無變更
-
2.0.5
2014-12-17
概要
git cherry-pick [--edit] [-n] [-m <parent-number>] [-s] [-x] [--ff]
[-S[<keyid>]] <commit>…
git cherry-pick (--continue | --skip | --abort | --quit)
描述
給定一個或多個現有提交,套用每個提交所引入的變更,並為每個變更記錄一個新的提交。這要求您的工作樹必須是乾淨的(即相對於 HEAD 提交沒有未提交的修改)。
當套用變更的方式不明顯時,會發生以下情況:
-
目前的分支和
HEAD指標會停留在最後一個成功建立的提交上。 -
CHERRY_PICK_HEAD參考(ref)會被設定為指向那個引入了難以套用變更的提交。 -
成功套用變更的路徑將會在索引檔案(index file)和您的工作樹中同時更新。
-
對於衝突的路徑,索引檔案會記錄最多三個版本,詳情請參閱 git-merge[1] 的「真實合併 (TRUE MERGE)」一節。工作樹檔案將包含衝突描述,並以常見的衝突標記 <<<<<<< 和 >>>>>>> 包圍。
-
不會進行其他修改。
請參閱 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 …)",以標示此變更是從哪個提交挑選而來的。這僅在無衝突的挑選中執行。如果您是從私人分支挑選,請勿使用此選項,因為這些資訊對接收者毫無用處。反之,如果您是在兩個公開可見的分支之間進行挑選(例如將修復程式從開發分支向後移植到舊版維護分支),則加入此資訊會很有幫助。
- -r
-
過去,此指令預設會執行上述的
-x,而-r是用來停用它。現在預設不會執行-x,因此此選項目前已失效(no-op)。 - -m <parent-number>
- --mainline <parent-number>
-
通常您無法挑選一個合併提交,因為您不知道應將合併的哪一邊視為主線(mainline)。此選項指定主線的父節點編號(從 1 開始),並允許 cherry-pick 相對於指定的父節點重演變更。
- -n
- --no-commit
-
通常此指令會自動建立一系列提交。此旗標將挑選每個命名提交所需的變更套用到您的工作樹和索引,但不進行任何提交。此外,當使用此選項時,您的索引不必與 HEAD 提交相符。挑選是相對於索引的初始狀態進行的。
這在連續將多個提交的影響挑選到索引中時非常有用。
- -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 與被挑選提交的父節點相同,則將執行「快轉」(fast-forward)至該提交。
- --allow-empty
-
預設情況下,挑選一個空提交會失敗,這表示需要明確呼叫
gitcommit--allow-empty。此選項會覆寫該行為,允許在挑選時自動保留空提交。請注意,當 "--ff" 生效時,即使沒有此選項,符合「快轉」條件的空提交也會被保留。另請注意,使用此選項僅保留最初就是空的提交(即提交記錄的樹狀結構與其父節點相同)。因前一次提交而變空的提交仍會導致挑選失敗。若要強制包含這些提交,請使用--empty=keep。 - --allow-empty-message
-
預設情況下,挑選一個沒有訊息的提交會失敗。此選項會覆寫該行為,允許挑選無訊息的提交。
- --empty=(drop|keep|stop)
-
如何處理那些與當前歷史中已有的變更重複的挑選提交。
請注意,
--empty=drop和--empty=stop僅指定如何處理並非最初為空、而是因前一次提交而變空的提交。除非指定了--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可以在使用單獨的 git-add[1] 將結果提交到索引之前,再次檢查 git-rerere[1] 的操作並捕捉潛在的錯誤合併。
範例
gitcherry-pickmaster-
套用 master 分支頂端的提交所引入的變更,並以此變更建立一個新提交。
gitcherry-pick..mastergitcherry-pick^HEADmaster-
套用所有屬於 master 的祖先但非 HEAD 的祖先所引入的變更,以產生新的提交。
gitcherry-pickmaintnext^mastergitcherry-pickmaintmaster..next-
套用所有屬於 maint 或 next 的祖先所引入的變更,但排除 master 或其任何祖先。請注意,後者並不意味著
maint以及master和next之間的所有內容;具體來說,如果maint已包含在master中,它將不會被使用。 gitcherry-pickmaster~4master~2-
套用 master 所指的倒數第五個和倒數第三個提交所引入的變更,並針對這些變更建立兩個新提交。
gitcherry-pick-nmaster~1next-
將 master 所指的倒數第二個提交以及 next 所指的最後一個提交所引入的變更套用到工作樹和索引,但不針對這些變更建立任何提交。
gitcherry-pick--ff..next-
如果歷史是線性的且 HEAD 是 next 的祖先,則更新工作樹並將 HEAD 指標前進以符合 next。否則,將所有存在於 next 中但不在 HEAD 中的提交所引入的變更套用到目前分支,為每個新變更建立一個新提交。
gitrev-list--reversemaster--README|gitcherry-pick-n--stdin-
將 master 分支上所有修改過 README 的提交所引入的變更套用到工作樹和索引,以便在合適時檢查結果並將其製作為單一的新提交。
以下序列嘗試向後移植一個修補程式(patch),因為該修補程式所套用的程式碼已變更過多而失敗,隨後再次嘗試,這次更加注意比對上下文行(context lines)。
$ git cherry-pick topic^ (1) $ git diff (2) $ git cherry-pick --abort (3) $ git cherry-pick -Xpatience topic^ (4)
-
套用
gitshowtopic^所顯示的變更。在此範例中,修補程式未成功套用,因此衝突的資訊被寫入索引和工作樹,且不會產生新提交。 -
總結需要調解的變更
-
取消 cherry-pick。換句話說,返回到 cherry-pick 前的狀態,同時保留您在工作樹中進行的任何本機修改。
-
嘗試再次套用
topic^引入的變更,花費額外時間以避免因比對上下文行不正確而產生的錯誤。
GIT
git[1] 套件的一部分