什么是 Git 的 cherry-pick

cherry-pick 是把另一个分支上的指定提交"摘"到当前分支:git cherry-pick <哈希>,通常把改动作为新提交应用。适合热修复回合、跨分支搬个别提交;通常产生新哈希,滥用会让历史难追溯。

最佳实践
Git 分支协作与合并示意

cherry-pick(摘樱桃)= 从别的分支挑指定的提交,把它的改动复制应用到当前分支。 merge 汇合历史,cherry-pick 选取指定提交的改动;该改动仍可能依赖未选取的其他提交。

基本用法

git checkout release-1.2
git cherry-pick a1b2c3d          # 把 main 上那个修复摘过来

典型场景

  • 热修复回合:main 上修的 bug 要同步到 release 分支,但 main 还有一堆不该进 release 的新功能——cherry-pick 只摘修复;
  • 摘取别人的提交:同事的实验分支里有个工具函数你想先用;
  • 提交错了分支:提交到 main 的功能提交摘到 feature 分支(仅在未共享的历史上考虑 reset;已共享历史应协调或用 revert 撤销)。

要点

  • 摘过来的是改动(diff),通常生成新哈希的提交;--ff 在 HEAD 正好是目标提交父节点时可直接快进,保留原提交;
  • 简单线性历史中的连续一串可用 git cherry-pick A^..B;复杂历史先检查范围,合并提交还需用 -m 选择父线;
  • 冲突处理和 merge 一样:解决 → add → git cherry-pick --continue。

常见问题(FAQ)

Q:cherry-pick 会导致重复提交吗?

通常会。同一改动可能以不同哈希存在于两个分支;后续 merge 基于祖先和树状态做合并,不是按 cherry-pick 记录自动跳过重复提交,结果可能干净也可能冲突。能 merge 就别滥用 cherry-pick。

Q:和 rebase 有什么区别?

rebase 把一串提交"移动"到新基点(更新正在变基的分支引用,其他分支、标签或 reflog 仍可能引用旧提交);cherry-pick 是"复制"指定提交,原分支不动。

Q:摘取时想改提交信息?

加 -e 进入编辑器;-x 在无冲突的拾取中自动追加 "(cherry picked from ...)" 来源记录;有冲突时应核对最终提交信息。公开分支之间回合修复时可用它追溯来源。

参考资料

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台