Git Cherry-Pick



命令 git cherry-pick 允许您选择并将特定提交从一个分支应用到另一个分支。

通过应用一个或多个先前提交所做的修改,git cherry-pick 命令为每个提交生成一个新的提交。

在开始之前,工作树需要是干净的(没有来自 HEAD 提交的更改)。

应用更改时

  • 成功的更改会更新受影响路径的索引和工作树。

  • 如果无法正确实现更改,则当前分支和 HEAD 保持不变。

  • 生成冲突的提交由 CHERRY_PICK_HEAD 引用指示。

  • 冲突路径在工作树中用冲突标记(<<<<<<<>>>>>>>)标记,并在索引中最多包含三个版本。

  • 除了这些特定更改之外,不会进行其他修改。

用法

当您想要从另一个分支获取特定的错误修复或功能并将其应用到当前分支而无需合并整个分支时,通常会使用 git cherry-pick 命令。

语法

git cherry-pick <commit>
  • 指定用于 cherry-pick 的提交由 <commit>... 指示。

  • 类似于使用 --no-walk,可以提供提交集,但默认情况下不会进行遍历。

  • 当指定范围时,将使用单个修订版遍历来处理所有 <commit>... 参数。

选项

git cherry-pick 命令具有以下选项

-e

--edit

git cherry-pick -e <commit>… git cherry-pick --edit <commit>
  • 通过在 git cherry-pick 中使用 -e--edit 选项,您可以在完成 cherry-pick 操作之前修改提交消息。

  • 应用指定提交的更改后,Git 会启动您的默认文本编辑器进行消息编辑。

  • 根据已 cherry-pick 的修改,此选项有助于提供更符合上下文或更具描述性的提交消息。

--cleanup=<mode>

git cherry-pick --cleanup=scissors <commit>
  • 在将提交消息发送到提交过程之前,Git 会根据 --cleanup=<mode> 选项对其进行格式化。

  • 如果 <mode> 设置为 scissors,则 Git 会在冲突期间将 scissors 添加到 MERGE_MSG 中,这使得手动冲突解决更容易。

-x

git cherry-pick -x <commit>
  • 为了记录 cherry-pick 的更改并标识其源提交。

    git cherry-pick 中的 -x 选项会将一行 cherry picked from commit …​ 添加到原始提交消息中。

  • cherry-pick 过程中出现的冲突不包含在此注释中。

-r

git cherry-pick -r <commit>
  • 过去,git cherry-pick 中的 -r 选项用于防止提交消息默认自动添加 cherry picked from commit

  • 根据当前默认设置,此注释不会默认插入,因此 -r 选项无效,被视为无操作。

-m <parent-number>

--mainline

git cherry-pick -m 1 <commit>
  • 在 Git cherry-pick 中,-m <parent-number>--mainline <parent-number> 选项指示要作为主线考虑的合并提交的父级。

  • 这使得 Git 可以相对于指定的父级(从 1 开始编号)重放更改,并有助于建立在从合并提交进行 cherry-pick 时应用更改的基础。

  • 为了确保在 cherry-pick 合并时应用正确的修改来源,此选项对于消除任何疑问至关重要。

-n

--no-commit

git cherry-pick -n <commit>… git cherry-pick --no-commit <commit>
  • 带有 -n--no-commit 选项的 Git cherry-pick 将指定提交的更改应用于工作树和索引,而不会自动生成提交。

  • 此选项允许针对索引的当前状态进行 cherry-pick,而不需要它与 HEAD 提交匹配,因此它有助于顺序地应用来自多个提交的更改,而无需单独提交每个更改。

-s

--signoff

git cherry-pick -s <commit>
  • 使用 -s--signoff 选项时,Git 会在提交消息的末尾插入 Signed-off-by 尾部。

  • 此尾部通常包含作者的姓名和电子邮件地址,证明作者有权根据项目的许可证要求提交代码。

  • 它充当数字签名,证明贡献的代码是真实的,并且作者已经检查过它。

-S[<keyid>]

--gpg-sign[=<keyid>]

--no-gpg-sign

  • 可以使用 -S--gpg-sign 选项在 Git 中对提交进行 GPG 签名。

  • 可以使用可选的 keyid 指定签名者的身份。

  • 另一方面,--no-gpg-sign 会反转此行为,它会覆盖任何先前的提交 GPG 签名配置。

--ff

git cherry-pick --ff <commit>
  • 如果当前 HEAD 已经是其直接父级,则 Git 的 cherry-pick 命令中的 --ff 选项允许快速转发合并到 cherry-pick 的提交。

--abort

git cherry-pick --abort
  • 如果 cherry-pick 过程中遇到冲突,或者您想出于任何其他原因停止操作,则 cherry-pick 过程将被取消。

--quit

git cherry-pick --quit
  • cherry-pick 过程停止,但它保留冲突解决,以便如果您以后想继续,您可以继续。

Explore our latest online courses and learn new skills at your own pace. Enroll and become a certified expert to boost your career.

处理合并冲突

如果在 cherry-pick 过程中出现冲突

  • Git 将停止该过程并标记冲突文件。

  • 手动解决冲突。

  • 解决后,使用

  • git add <resolved-file> git cherry-pick --continue

Cherry-pick 多个提交

可以使用以下命令一起 cherry-pick 不同的提交

git cherry-pick <commit1>^..<commit2>

也可以使用以下命令 cherry-pick 不连续的提交

git cherry-pick <commit1> <commit2> <commit3>

因此,此命令的目的是将特定提交从一个分支应用到另一个分支,而无需合并整个分支。

广告