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
相关推荐
用户059540174461 小时前
Playwright 网络拦截踩坑实录:我花了 3 小时才搞懂数据持久化验证的正确姿势
前端·css
weedsfly1 小时前
React 开发中的闭包陷阱:四个真实场景,让你彻底理解闭包
前端·react.js
初圣魔门首席弟子1 小时前
AI Agent 核心原理:工具调用(Function Calling)完整工作流程详解
前端·数据库·人工智能
CodeSheep1 小时前
又是梁文锋,有点猛啊。
前端·后端·程序员
陈老老老板1 小时前
如何用 Bright Data Web Scraper API + Coze 搭建 Reddit 行业情报聚合 Bot(2026 实战指南)
前端·人工智能
恋猫de小郭1 小时前
由于 iOS 26 的键盘变化,Flutter 又要重构键盘区域逻辑
android·前端·flutter
怕浪猫1 小时前
Electron 开发实战(十五):实战项目|从零搭建桌面即时通讯(IM)应用
前端·javascript·electron
喜欢踢足球的老罗2 小时前
破解 Chrome 扩展的「两世界难题」:MV3 下的 ISOLATED 与 MAIN World 桥接之道
前端·chrome