設定和配置
獲取和建立專案
基本快照
分支與合併
共享和更新專案
檢查和比較
打補丁
除錯
電子郵件
外部系統
伺服器管理
指南
管理
底層命令
- 2.50.1 → 2.52.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_HEADref 被設定為指向引入難以應用的更改的提交。 -
已乾淨應用更改的路徑將在索引檔案和您的工作區中都得到更新。
-
對於衝突路徑,索引檔案會記錄多達三個版本,如 git-merge[1] 的“真實合併”部分所述。工作區檔案將包含用常規衝突標記 <<<<<<< 和 >>>>>>> 括起來的衝突描述。
-
不進行其他修改。
有關解決此類衝突的提示,請參閱 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 的提交。
請注意,
--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所做的操作,並在使用單獨的gitadd將結果提交到索引之前,捕獲潛在的錯誤合併。
示例
gitcherry-pickmaster-
應用 master 分支尖端提交引入的更改,並用此更改建立一個新提交。
gitcherry-pick..mastergitcherry-pick^HEADmaster-
應用 master 的祖先但不是 HEAD 的所有提交引入的更改,以產生新提交。
gitcherry-pickmaintnext^mastergitcherry-pickmaintmaster..next-
應用 maint 或 next 的祖先但不是 master 或其任何祖先的所有提交引入的更改。請注意,後者不意味著
maint以及master和next之間的內容;具體來說,如果maint包含在master中,則不會使用maint。 gitcherry-pickmaster~4master~2-
應用 master 指向的第五個和第三個最後提交引入的更改,並用這些更改建立 2 個新提交。
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 的所有提交引入的更改應用到工作區和索引,以便可以檢查結果,並在合適時將其合併為一個新提交。
以下序列嘗試 backport 一個補丁,但由於補丁適用的程式碼已更改太多而失敗,然後再次嘗試,這次更加謹慎地匹配上下文行。
$ git cherry-pick topic^ (1) $ git diff (2) $ git cherry-pick --abort (3) $ git cherry-pick -Xpatience topic^ (4)
-
應用
git show topic^將顯示的更改。在此示例中,補丁未乾淨應用,因此有關衝突的資訊會寫入索引和工作區,並且不會產生新提交。 -
總結要協調的更改
-
取消 cherry-pick。換句話說,返回到 cherry-pick 前的狀態,保留您在工作區中的任何本地修改。
-
嘗試再次應用
topic^引入的更改,花費額外時間避免因錯誤匹配上下文行而導致的錯誤。