Git Cherry Pick 常用操作

一、什么是 Cherry Pick?


git cherry-pick:选择性复制【指定某几条 commit】,精准应用到当前分支。

和 merge / rebase 的区别:

  • merge:合并整个分支所有改动
  • rebase:平移整条分支提交记录
  • cherry-pick只摘你想要的某几个提交,精准、轻量化

适用核心场景:不想合并整个分支,仅需要迁移少量 commit。

二、前置准备


1. 切换到目标分支

你要把代码合到哪个分支,就切到哪个分支

bash 复制代码
git checkout 目标分支
# 示例:git checkout main

2. 获取需要迁移的 CommitID

bash 复制代码
git log  # 查看历史提交,复制 commit 哈希(前7位即可)

三、基础常用命令


1. 拾取单个提交(最常用)

xml 复制代码
git cherry-pick <commitID>

效果:将该提交的代码改动复制到当前分支,生成一条全新的 commit

2. 拾取多个不连续提交

复制代码
git cherry-pick commit1 commit2 commit3

3. 拾取一段连续提交

复制代码
git cherry-pick commitStart^..commitEnd

说明:包含 start 和 end 之间所有提交(左闭右闭

4. 只应用代码,不自动提交(灵活修改)

xml 复制代码
git cherry-pick <commitID> -n

适用:需要微调代码、合并多个提交为一个 commit 时使用

操作后需手动执行:git add . && git commit -m "xxx"

四、核心参数速查表


参数 作用说明
-n / --no-commit 应用修改,但不自动生成提交记录
--continue 解决冲突后,继续完成拾取
--abort 放弃本次拾取,完全回退到操作前状态
--skip 跳过当前冲突的 commit,继续下一个
-m 1 / -m 2 拾取 merge 合并提交时,指定父分支代码

五、冲突标准处理流程(高频)

cherry-pick 遇到代码重叠会冲突,固定处理步骤:

  1. 打开冲突文件,手动修改解决冲突
  2. 暂存修改:git add .
  3. 继续拾取流程:git cherry-pick --continue
  4. 完成后推送远程即可

❌ 不想处理、想撤销:直接执行 git cherry-pick --abort(干净回退,无残留)

六、工作中最常用的 6 大实战场景


场景1:开发分支修复Bug,单独同步到线上主分支

需求:dev 分支修了一个紧急Bug,不想合并整个 dev,只把这个Bug修复合到 main

perl 复制代码
# 1. 切到主分支
git checkout main
# 2. 拾取Bug修复的提交
git cherry-pick 2f3d4e5
# 3. 推送上线
git push

场景2:只合并某个功能提交,丢弃分支其他垃圾提交

需求:测试分支有多次调试提交,只需最终正式功能提交,过滤中间日志、调试代码

arduino 复制代码
git checkout release
git cherry-pick 目标功能commitID

场景3:误删提交/丢代码,精准恢复历史提交

需求:之前某个提交被误回退,现在需要单独恢复这一段代码

复制代码
git cherry-pick 历史丢失commitID

场景4:多版本迭代,跨分支同步热更新

需求:v1.2 版本修的Bug,需要同步到 v1.3 新版本分支

复制代码
git checkout v1.3
git cherry-pick bugCommitID

场景5:批量同步连续多个功能提交

需求:某一段迭代的所有功能,全部迁移到目标分支

erlang 复制代码
git cherry-pick startCommit^..endCommit

场景6:拾取合并(Merge)类型的提交

普通 cherry-pick 无法拾取 merge 提交,必须加 -m 参数

bash 复制代码
# -m 2 一般取被合并分支的代码改动
git cherry-pick -m 2 mergeCommitID

七、重点避坑规范(团队协作必看)


  • 禁止在公共分支反复cherry-pick:同一提交重复拾取会造成代码冗余、冲突爆炸
  • cherry-pick 会生成新commit:新旧 commit ID 不同,不是覆盖,是复制
  • 大量提交用 merge/rebase:超过5个提交不建议cherry-pick,效率极低
  • 公共保护分支(main/master)只进不出:只允许往主分支pick,不允许主分支pick到开发分支
  • 冲突优先 --abort 撤销:不确定冲突逻辑时,直接放弃重 pick,避免改乱代码

八、快速记忆总结


  • 单条拾取:git cherry-pick commitID
  • 多条拾取:git cherry-pick c1 c2 c3
  • 连续拾取:git cherry-pick start^..end
  • 不自动提交:git cherry-pick commitID -n
  • 冲突继续:--continue
  • 放弃撤销:--abort
相关推荐
可乐鸡翅yeah_8 小时前
hls.js 多实例并发踩坑,多视频页面播放器内存与冲突问题解决
开发语言·前端·javascript·音视频·hls·m3u8·m3u8在线播放
涛涛ing8 小时前
你的页面为什么总是卡成PPT?2026年,90%的前端都忽略了主线程
前端
SoaringHeart8 小时前
Flutter 进阶 | 组件封装:用 CustomPainter 实现光环动画组件AnimatedHalo
前端·flutter
IT_陈寒8 小时前
JavaScript的隐式转换太坑了,我的==比较怎么就炸了?
前端·人工智能·后端
雪芽蓝域zzs8 小时前
第十四节:后端返回权限动态路由
前端·javascript·vue.js
Rain5098 小时前
谁动了我的 URL?——记一次微前端“灵异 Bug“的排查实录
前端·vue.js·人工智能·前端框架·bug·ai编程
bjzhang759 小时前
使用HTML+CSS美化上传进度条展示
前端·css·html
何以解忧,唯有..9 小时前
Vue 3 响应式核心:ref() 与 reactive() 的深入解析与实战
前端·javascript·vue.js
晴天169 小时前
Chrome DevTools Protocol(CDP)分享-Day36
前端·chrome·chrome devtools
风骏时光牛马9 小时前
程序员的职场成长:技术之外,更要修炼底层思考力
前端