Command Reference

git cherry-pick 教程

解释如何把某个提交的改动拣选到当前分支,以及 cherry-pick 的典型适用边界。

适合谁看
  • 要把补丁带到另一个分支的人
  • 维护发布分支和回补修复的人
前置知识
  • 知道目标提交可能依赖前置提交
  • 会判断是 pick 单个补丁还是整合整条分支
常见风险
  • 在多分支重复 pick 造成历史混乱
  • 忽略前置依赖导致目标分支状态不完整

一句话理解

git cherry-pick 会把指定提交引入的改动,重新应用到当前分支上。

它最适合什么场景

  • 把某个修复补丁从一个分支带到另一个分支
  • 只需要某几个提交,而不是整条分支历史
  • 发布分支需要精确挑选变更时

基本用法

git checkout release/1.2
git cherry-pick <commit-hash>

这会在当前分支上创建一个新的提交,内容来自被挑选的提交,但提交 ID 会不同。

一次挑多个提交

git cherry-pick <commit-a> <commit-b>

如果这些提交存在依赖关系,建议按照原始顺序挑选。

cherry-pick 转运的是补丁,不是整条分支源分支里的提交效果会在目标分支上生成新的对应提交。你保留了改动意图,但不会保留原始提交 ID 和父提交关系。
源分支补丁
main
ABC
feature
BDE
目标分支新提交
release
AR1E'

典型使用场景

场景 1:把线上修复带回发布分支

主分支上已经修了一个 bug,但你不想把整条开发历史合并到发布分支时,cherry-pick 很适合做补丁回带。

场景 2:从实验分支中选中一个成熟提交

如果实验分支里只有一部分提交值得保留,直接 merge 往往太重,这时 cherry-pick 更精确。

冲突时怎么处理

git status
# 解决冲突
git add <resolved-files>
git cherry-pick --continue

放弃当前操作:

git cherry-pick --abort

它和 merge / rebase 的区别

  • merge:整合一段分支历史
  • rebase:重写一组提交的基底
  • cherry-pick:只拿某个或某几个提交的内容

所以 cherry-pick 更像“精确搬运改动”,而不是“整合整条历史线”。

使用前要注意什么

  • 先确认目标提交是否依赖别的前置提交
  • 先确认当前分支是否已经包含同类改动
  • 先确认你是不是应该整合整条分支,而不是单挑提交

常见误区

误区 1:cherry-pick 完全等于复制提交

不对。它复制的是改动效果,不是原始提交对象本身。

误区 2:cherry-pick 越多越灵活

过度使用会让不同分支之间出现重复但不完全相同的提交,后续排查历史时会更复杂。

实践建议

如果一个功能需要长期存在于多个分支,优先考虑更稳定的分支策略;cherry-pick 更适合补丁级、精选式迁移。

这条命令在流程里解决什么问题

git cherry-pick 直接影响历史表达、引用位置或提交之间的关系。读这类命令时,要先判断这次操作是在整理本地未共享历史,还是在处理已经公开给团队的历史。

典型用例

  • 在合并、回滚、挑提交或整理提交序列时,用 git cherry-pick 重塑历史表达。
  • git cherry-pick 放进“先备份、再变更、最后复核”的高风险操作流程,降低误操作损失。
  • 在复盘冲突、回滚事故或判断分支关系时,用 git cherry-pick 理清提交之间的因果链。

图例理解

历史命令的作用面历史类命令通常围绕提交、当前分支和祖先关系展开,差别在于它是新增历史、移动引用,还是重写已有序列。
输入
提交序列当前分支祖先关系
结果
新的提交关系移动后的引用可恢复路径
这类命令执行前最值得确认的一件事,是“这段历史是不是已经共享给别人”。

特殊情况与边界

  • 历史类命令最常见的风险,是对已经共享出去的提交继续做重写或移动。
  • 如果这次操作可能影响团队协作,先跑 git statusgit log --oneline --graphgit reflog,再决定是否继续。
  • 一旦不确定,就先建一个备份分支,让自己保留“能回去”的选项。

跟着做一遍

练习:把一个补丁回带到发布分支

这组练习要观察的是“改动效果被转运过来了,但提交身份和父链已经变了”。

准备环境
git switch -c release/1.2
# 另开一个 feature 分支做一条修复提交
跟着做
  1. 记下 feature 分支上那条修复提交的 hash。
  2. 切回 release 分支执行 `git cherry-pick <hash>`。
  3. 用 `git log --oneline --graph --decorate --all` 看看新提交与原提交的关系。
结果会怎样
  • 目标分支会新增一个内容相近但 ID 不同的新提交。
  • 原始父链不会被搬过来。
  • 如果挑的是补丁而不是整条历史,这通常比 merge 更精确。
常见错误判断
  • 如果目标提交依赖前置提交,单独 pick 可能会留下不完整状态。
  • 如果同类改动已经存在,重复 cherry-pick 会让历史更难读。
  • 如果你真正需要的是整条分支历史,merge 通常更清楚。

继续学习建议

后续建议配合阅读:

  1. git merge
  2. git rebase
  3. git reset