設定和配置
獲取和建立專案
基本快照
分支與合併
共享和更新專案
檢查和比較
打補丁
除錯
電子郵件
外部系統
伺服器管理
指南
管理
底層命令
- 2.50.1 無更改
-
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
引用被設定為指向引入難以應用更改的提交。 -
更改已乾淨應用的檔案路徑會在索引檔案和您的工作樹中都進行更新。
-
對於衝突路徑,索引檔案會記錄最多三個版本,如 git-merge[1] 的“真實合併”部分所述。工作樹檔案將包含衝突描述,並用通常的衝突標記 <<<<<<< 和 >>>>>>> 括起來。
-
沒有進行其他修改。
有關解決此類衝突的一些提示,請參閱 git-merge[1]。
選項
- <提交>…
-
要揀選的提交。有關更完整的提交拼寫方式列表,請參閱 gitrevisions[7]。可以傳遞提交集,但預設情況下不進行遍歷,就像指定了
--no-walk
選項一樣,請參閱 git-rev-list[1]。請注意,指定一個範圍會將所有 <提交>… 引數提供給一次單獨的修訂遍歷(請參閱後面使用 maint master..next 的示例)。 - -e
- --edit
-
使用此選項,git cherry-pick 將允許您在提交之前編輯提交訊息。
- --cleanup=<模式>
-
此選項決定了提交訊息在傳遞給提交機制之前如何清理。有關更多詳細資訊,請參閱 git-commit[1]。特別是,如果 <模式> 的值為
scissors
,則在發生衝突時,MERGE_MSG
在傳遞之前將附加剪刀線。 - -x
-
記錄提交時,在原始提交訊息後附加一行 "(cherry picked from commit …)",以指示此更改是從哪個提交揀選的。這僅適用於沒有衝突的揀選。如果您從私人分支揀選,請勿使用此選項,因為此資訊對接收方無用。另一方面,如果您在兩個公開可見的分支之間揀選(例如,將針對舊版本的維護分支的修復從開發分支回溯),新增此資訊可能很有用。
- -r
-
以前,該命令預設執行上述
-x
,而-r
用於停用它。現在預設不執行-x
,因此此選項是空操作(no-op)。 - -m <父編號>
- --mainline <父編號>
-
通常您無法揀選合併提交,因為您不知道合併的哪一邊應該被視為主線。此選項指定主線的父編號(從1開始),並允許 cherry-pick 相對於指定的父提交重放更改。
- -n
- --no-commit
-
通常該命令會自動建立一系列提交。此標誌將揀選每個指定提交所需的更改應用到您的工作樹和索引中,而不進行任何提交。此外,使用此選項時,您的索引不必與 HEAD 提交匹配。揀選是針對您索引的起始狀態進行的。
當您連續揀選多個提交的效果到您的索引中時,這很有用。
- -s
- --signoff
-
在提交訊息末尾新增一個
Signed-off-by
尾部資訊。有關更多資訊,請參閱 git-commit[1] 中的 signoff 選項。 - -S[<金鑰ID>]
- --gpg-sign[=<金鑰ID>]
- --no-gpg-sign
-
GPG 簽署提交。
keyid
引數是可選的,預設為提交者身份;如果指定,它必須緊貼選項,中間不能有空格。--no-gpg-sign
對於抵消commit.gpgSign
配置變數和先前的--gpg-sign
都很有用。 - --ff
-
如果當前 HEAD 與被揀選提交的父提交相同,則將執行快進到此提交的操作。
- --allow-empty
-
預設情況下,揀選空提交會失敗,表示需要顯式呼叫
git
commit
--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=<策略>
-
使用給定的合併策略。只能使用一次。有關詳細資訊,請參閱 git-merge[1] 中的 MERGE STRATEGIES 部分。
- -X<選項>
- --strategy-option=<選項>
-
將合併策略特定的選項傳遞給合併策略。有關詳細資訊,請參閱 git-merge[1]。
--rerere-autoupdate
--no-rerere-autoupdate
-
在 rerere 機制重用當前衝突上的已記錄解決方案以更新工作樹中的檔案後,允許它也使用解決方案結果更新索引。
--no-rerere-autoupdate
是在透過單獨的git
add
將結果提交到索引之前,仔細檢查rerere
所做的工作並捕獲潛在錯誤合併的好方法。
示例
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
和master
與next
之間的所有內容;具體來說,如果maint
包含在master
中,則不會使用它。 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 的提交引入的更改應用到工作樹和索引,以便檢查結果並在合適時將其合併為單個新提交。
以下序列嘗試回溯一個補丁,由於補丁應用的 程式碼更改過多而中止,然後再次嘗試,這次更仔細地匹配上下文行。
$ git cherry-pick topic^ (1) $ git diff (2) $ git cherry-pick --abort (3) $ git cherry-pick -Xpatience topic^ (4)
-
應用由
git
show
topic^
顯示的更改。在此示例中,補丁未乾淨地應用,因此有關衝突的資訊被寫入索引和工作樹,並且沒有產生新的提交。 -
總結待協調的更改
-
取消揀選。換句話說,返回到揀選前的狀態,保留您在工作樹中進行的任何本地修改。
-
再次嘗試應用
topic^
引入的更改,花費額外時間避免因不正確匹配上下文行而導致的錯誤。