Menu
CoddyTech

Git Cherry-pick

最后更新

git cherry-pick 复制一个或多个特定提交中的更改,并把它们作为新提交应用到你的当前分支上。有了它,你可以只从另一个分支拿走一个修复,而不必合并整个分支。它很适合把热修复移植到旧版本,或者从功能分支中单独取出一个提交。

在终端在线编辑器中试试这些命令:浏览器里就有一个真正的 shell,无需安装任何东西。

git cherry-pick 从另一个分支复制一个选定的提交,并应用到你当前的分支上。

语法

命令作用
git cherry-pick <hash>把一个提交应用到当前分支
git cherry-pick <a> <b>按顺序应用多个提交
git cherry-pick <a>..<b>应用一段范围内的提交(不包括 a)
git cherry-pick -n <hash>应用更改,但暂不提交
git cherry-pick -x <hash>在提交信息中注明原始提交

cherry-pick 进行中

如果 cherry-pick 遇到冲突,解决冲突后继续即可。

命令作用
git cherry-pick --continue解决冲突后继续
git cherry-pick --abort取消并恢复分支
git cherry-pick --skip跳过当前提交

完整示例

步骤命令结果
1git log --oneline hotfix找到修复提交的哈希值,例如 a1b2c3d
2git switch main切换到要接收这个修复的分支
3git cherry-pick a1b2c3d把修复作为一个新提交应用到 main,哈希值也是新的

Git cherry-pick 常见问题

git cherry-pick 是做什么的?

它取出某个特定提交引入的更改,并作为一个全新的提交(哈希值也是新的)应用到你的当前分支上。和 merge 或 rebase 不同,它不会带来整个分支,只会带来你指定的那一个或几个提交。

什么时候该用 cherry-pick?
当你需要把某个特定提交放到别处时就用它。例如,把 main 上的 bug 修复移植到发布分支,或者从功能分支中单独取出一个有用的提交,而不合并全部内容。如果你想要整个分支,请改用 merge 或 rebase。
如何 cherry-pick 多个提交?
把它们都列出来:git cherry-pick <a> <b> <c> 会按顺序逐个应用。对于一段连续的范围,使用 git cherry-pick <start>..<end>,它会应用 start 之后、直到 end 为止(含)的每个提交。如果想把 start 本身也包括进来,就写成 <start>^..<end>。
cherry-pick 引起冲突怎么办?
Git 会暂停,并标记出有冲突的文件。解决冲突后,用 git add 添加结果,然后运行 git cherry-pick --continue。如果想完全退出,使用 git cherry-pick --abort,它会把分支恢复到 cherry-pick 开始之前的状态。
如何从另一个分支 cherry-pick 一个提交?
用 git log --oneline <other-branch> 找到这个提交的哈希值,切换到要接收它的分支,然后运行 git cherry-pick <hash>。你也可以直接传入分支名,比如 git cherry-pick feature,它会挑选那个分支最新的提交。
cherry-pick 和 merge 有什么区别?
git merge 会带来一个分支上的所有提交,并记录两段历史在哪里汇合。cherry-pick 只把你指定的提交复制为新提交,和原来的提交没有关联。想要整个分支时就合并;只想要一两个提交时就用 cherry-pick。
可以在线练习吗?
可以。打开终端在线编辑器,就能在浏览器里真正的 shell 中运行 git cherry-pick,无需安装任何东西。Coddy 免费的互动式 Git 课程也会一步步讲解如何在分支之间移动提交。
Coddy 编程语言插图

在 Coddy 学习 Git

开始