Git Cherry-pick
最后更新
git cherry-pick 复制一个或多个特定提交中的更改,并把它们作为新提交应用到你的当前分支上。有了它,你可以只从另一个分支拿走一个修复,而不必合并整个分支。它很适合把热修复移植到旧版本,或者从功能分支中单独取出一个提交。
在终端在线编辑器中试试这些命令:浏览器里就有一个真正的 shell,无需安装任何东西。
语法
| 命令 | 作用 |
|---|---|
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 | 跳过当前提交 |
完整示例
| 步骤 | 命令 | 结果 |
|---|---|---|
| 1 | git log --oneline hotfix | 找到修复提交的哈希值,例如 a1b2c3d |
| 2 | git switch main | 切换到要接收这个修复的分支 |
| 3 | git 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 课程也会一步步讲解如何在分支之间移动提交。