参数详情

  • -e, --edit 使用此选项时,git cherry-pick 将允许你在提交之前编辑提交消息。
  • -x 在记录提交时,将一行内容“(从提交 … 拣选而来)”追加到原始提交消息的末尾,以指示此更改是从哪个提交拣选而来的。这仅适用于没有冲突的拣选操作。
  • --ff 如果当前 HEAD 与拣选提交的父提交相同,则执行快速前进到该提交的操作。
  • --continue 使用 .git/sequencer 中的信息继续正在进行的操作。可用于解决失败的拣选或还原操作中的冲突后继续操作。
  • --quit 忘记正在进行的操作。可用于清除失败的拣选或还原操作后的 sequencer 状态。
  • --abort 取消操作并返回到序列之前的状态。

拣选提交 将在某个提交中引入的补丁尝试重新应用到你当前所在的分支。

17.1 从一个分支复制提交到另一个分支

git cherry-pick <commit-hash>

此命令将现有提交中的更改应用到另一个分支,同时记录一个新的提交。本质上,你可以从一个分支复制提交到另一个分支。

假设你有以下提交树(来源):

dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master]
 \
  76cada - 62ecb3 - b886a0 [feature]

假设我们想要将 b886a0 复制到 master(基于 5a6057)。

我们可以运行以下命令:

git checkout master
git cherry-pick b886a0

现在,提交树将如下所示:

dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 - a66b23 [master]
 \
  76cada - 62ecb3 - b886a0 [feature]

其中,新的提交 a66b23 具有与 b886a0 相同的内容(源代码差异、提交消息),但父提交不同。注意,拣选提交只会获取该提交(本例中为 b886a0)的更改,而不是 feature 分支中的所有更改(对于这种情况,你需要使用变基或合并)。

17.2 从一个分支复制一系列提交到另一个分支

git cherry-pick <commit-A>..<commit-B>

此命令将提交 A 之后的所有提交(包括 B)应用到当前检出的分支。

git cherry-pick <commit-A>^..<commit-B>

此命令将提交 A 和提交 B 之间的所有提交(包括 B)应用到当前检出的分支。

17.3 检查是否需要拣选提交

在开始拣选提交过程之前,你可以检查你想要拣选的提交是否已经在目标分支中,如果是这样,你就不需要执行任何操作。

git branch --contains <commit>

此命令列出包含指定提交的本地分支。

git branch -r --contains <commit>

此命令还包括远程跟踪分支。

17.4 查找尚未应用到上游的提交

git cherry 命令显示尚未拣选的更改。

例如:

git checkout master
git cherry development

输出如下:

+ 492508acab7b454eee8b805f8ba906056eede0ff
- 5ceb5a9077ddb9e78b1e8f24bfc70e674c627949
+ b4459544c000f4d51d1ec23f279d9cdb19c1d32b
+ b6ce3b78e938644a293b2dd2a15b2fecb1b54cd9

以 + 开头的提交是尚未拣选到 development 分支的提交。

语法:

git cherry [-v] [<upstream> [<head> [<limit>]]]

选项:

  • -v 在 SHA1 旁边显示提交主题。
  • <upstream> 搜索等效提交的上游分支。默认为 HEAD 的上游分支。
  • <head> 工作分支;默认为 HEAD。
  • <limit> 不报告直到(包括)limit 的提交。

更多信息请参阅 git-cherry 文档。