Git cherry-pick 使用小技巧

背景

前段时间我在实现 StarRocks 的一个关于资源限制的特性,由于该功能需要基于最新的 3.5 tag 进行开发,所以我需要需要从 3.5 的 tag 里拉出一个分支(3.5-feature)开发完成后再向上游的 main 分支提交 PR。

解决方案

如果直接使用 3.5-feature 分支向 main 提交 PR 会有很多之前的 commit 导致文件修改很多,所以得换一种方式提交这些变更。

stash

解决这个问题的办法也蛮多的,第一种是使用 git stash

这个可以先将修改临时保存,然后再需要的时候再将 stash 里的数据应用到当前分支。

但这样有几个问题:

  • 开发的过程中没法提交代码了,提交之后就没法保存到 stash 里,没有提交代码总会有丢数据的风险。
  • 后续需要多次提交时,stash 也不支持,毕竟 stash 之后当前分支的代码就没有了。

手动复制

第二种办法那就是先把代码提交到 3.5-feature,然后重新基于 main 分支重新拉取一个分支,再手动对比 3.5-feature 的提交记录进行修改。

这样的好处是提交记录比较干净,但坏处是改动较多的话容易遗漏代码,并且每次在 3.5-feature 的改动都需要人工同步过来。

cherry-pick

我第一次看到 cherry-pick 的用法还是在 Pulsar 社区里,经常看到有 PR 将某个在 main 分支的特性 cherry-pick 到其他分支。

或者是一些重要的安全更新也需要在一些维护版本的分支进行修复。

cherry-pick 的主要作用是将其他分支的特定提交精确合并到当前分支,以便在不合并整个分支的情况下同步修复、hot-fix 或者是复用代码;

使用流程如下:

shell 复制代码
git checkout main 
git pull origin main 
git checkout -b main-feature
shell 复制代码
# 只pick你真正需要的功能相关提交

# 你的核心功能提交1 
git cherry-pick abc123 

# 你的核心功能提交2
git cherry-pick def456 ...

这里的 abc123 和 def456 都是提交记录的 hash 值,可以通过 git log 命令获取;也可以在 github 的提交记录页面复制。

如果碰到冲突先解决,然后执行:

shell 复制代码
git cherry-pick --continue

git push origin main-feature

假设存在两个分支:

shell 复制代码
    a - b - c - d   main
         \
           e - f - g main-feature
shell 复制代码
git cherry-pick f

现在需要将 main-feature 分支里的 f 提交到 main 分支,cherry-pick 之后会变成这样:

shell 复制代码
    a - b - c - d - f   main
         \
           e - f - g main-feature

f 这个提交就会被追加到头部。

适用场景

cherry-pick 主要应用与一些小的修复,安全更新、紧急 bug 的处理,如果一个分支上的大部分 commit 都要被 cherry-pick 到另一个分支,不如考虑直接 使用 merge 或者 rebase。

就像这个功能的名称一样:摘樱桃。选择合适的果子进行摘取,而不是把所有的提交都合并过去。

相关推荐
浅念-9 小时前
一文吃透Git:本地操作|冲突处理|远程协作|GitFlow工作流详解
大数据·git·elasticsearch·搜索引擎·gitflow
wangruofeng9 小时前
120+ 个 Agent Skill 管不过来?我造了套「包管理器」:仓库是源,链接是安装
github·aigc·ai编程
七牛云行业应用9 小时前
Cursor Origin发布:同一天GitHub宕机,AI原生代码托管来了
人工智能·github·agent·ai编程·ai-native
xyz_CDragon9 小时前
GitHub上4个爆款AI开源Skill:拍照后不用P图,用Codex一键生成高级海报(附效果图+使用教程)
人工智能·python·github·codex·skill
滕州市燕猫虎计算机科技工作室个体工商户13 小时前
Git常用命令汇总
git
天若有情67314 小时前
表面普通随机数网页,藏有隐藏后台面板,暗号解锁|Github Pages 在线演示
github
czhc114007566315 小时前
2026-09-11 一日综合:树的父链、git 概念、三方死锁、静默失败
大数据·git·elasticsearch
ChampaignWolf15 小时前
abapgit-agent:用 Git 当中介,让 Claude Code 自己完成 ABAP 闭环开发
git·ai·abap·claude·abapgit·mcp
嘴贱欠吻!15 小时前
如何成为 CJMP 贡献者:AtomGit贡献流程与要求
git·ci/cd
滕州市燕猫虎计算机科技工作室个体工商户16 小时前
.gitignore文件不生效的解决方法
git·.gitignore·.gitignore不生效