- 要把补丁带到另一个分支的人
- 维护发布分支和回补修复的人
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>
如果这些提交存在依赖关系,建议按照原始顺序挑选。
源分支补丁
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 status、git log --oneline --graph和git reflog,再决定是否继续。 - 一旦不确定,就先建一个备份分支,让自己保留“能回去”的选项。
跟着做一遍
这组练习要观察的是“改动效果被转运过来了,但提交身份和父链已经变了”。
git switch -c release/1.2 # 另开一个 feature 分支做一条修复提交跟着做
- 记下 feature 分支上那条修复提交的 hash。
- 切回 release 分支执行 `git cherry-pick <hash>`。
- 用 `git log --oneline --graph --decorate --all` 看看新提交与原提交的关系。
- 目标分支会新增一个内容相近但 ID 不同的新提交。
- 原始父链不会被搬过来。
- 如果挑的是补丁而不是整条历史,这通常比 merge 更精确。
- 如果目标提交依赖前置提交,单独 pick 可能会留下不完整状态。
- 如果同类改动已经存在,重复 cherry-pick 会让历史更难读。
- 如果你真正需要的是整条分支历史,merge 通常更清楚。
继续学习建议
后续建议配合阅读:
git mergegit rebasegit reset