文章目录
- [1. 简介](#1. 简介)
- [2. 格式](#2. 格式)
- [3. 选项](#3. 选项)
- [4. 示例](#4. 示例)
-
- [4.1 挑选单个提交](#4.1 挑选单个提交)
- [4.2 挑选多个提交](#4.2 挑选多个提交)
- [4.3 只暂存不提交](#4.3 只暂存不提交)
- [4.4 解决冲突](#4.4 解决冲突)
- [5. 注意](#5. 注意)
-
- [5.1 `cherry-pick` 与 `merge` 的区别](#5.1
cherry-pick与merge的区别) - [5.2 复制的是新提交,不是原提交](#5.2 复制的是新提交,不是原提交)
- [5.3 常用别名设置](#5.3 常用别名设置)
- [5.1 `cherry-pick` 与 `merge` 的区别](#5.1
- [6. 小结](#6. 小结)
- 参考文献
1. 简介
git cherry-pick 用于应用某些现有提交引入的更改。
git cherry-pick 可以将指定的提交(commit)复制到当前分支。它不会合并整个分支,而是只挑选你需要的某几个提交。
典型场景:
- 修复 bug 的提交需要同步到其他分支
- 不小心在错误分支上做了提交,想移植到正确分支
- 只想要某个功能分支上的部分提交,而不是全部。
比如 main 分支有如下提交记录,A -> B -> C,程序在运行过程中,提交 B 引入的特性存在一个隐藏很深的 bug,现在需要将 B 从分支踢出,但是需要保留提交 C。此时需要将分支回退(reset) 到 A,然后使用 cherry-pick 将 C 的更改应用到 A。这里要注意,cherry-pick 时 C 一定要存在,不然会出错,这就要求我们在回滚 main 分支前,基于 main 先创建一个新的分支来保留提交 C。
2. 格式
bash
git cherry-pick [<options>] <commit>...
git cherry-pick (--continue | --skip | --abort | --quit)
3. 选项
bash
-n, --no-commit
只暂存变更,不自动提交(可继续修改或添加其他变更)
-e, --edit
在提交前编辑提交信息
-x
在提交信息末尾添加来源说明(如 `(cherry picked from commit ...)`)
--continue
解决冲突后继续 cherry-pick
--skip
跳过当前提交
--abort
放弃 cherry-pick,恢复到操作前的状态
--quit
放弃 cherry-pick,但保留当前工作区和暂存区状态
--signoff
在提交信息末尾添加 `Signed-off-by` 行
4. 示例
4.1 挑选单个提交
bash
# 复制指定提交到当前分支
git cherry-pick a1b2c3d
4.2 挑选多个提交
bash
# 复制多个提交(按顺序)
git cherry-pick a1b2c3d e4f5g6h
# 复制一段连续范围(不包含 A,包含 B)
git cherry-pick A..B
4.3 只暂存不提交
bash
# 只将变更加入暂存区,不自动提交(可继续修改)
git cherry-pick -n a1b2c3d
4.4 解决冲突
bash
# 挑选时产生冲突
git cherry-pick a1b2c3d
# CONFLICT in main.go
# 手动解决冲突后
git add main.go
git cherry-pick --continue
# 或者跳过当前提交
git cherry-pick --skip
# 或者放弃整个 cherry-pick
git cherry-pick --abort
5. 注意
5.1 cherry-pick 与 merge 的区别
| 对比维度 | git merge |
git cherry-pick |
|---|---|---|
| 复制范围 | 整个分支的所有提交 | 只复制指定的提交 |
| 历史关系 | 保留分支结构 | 复制后的提交是全新的(新 ID) |
| 适用场景 | 合并完整功能 | 挑选单个 bug 修复 |
5.2 复制的是新提交,不是原提交
bash
# 原提交 ID
git log --oneline -1 feature
# a1b2c3d fix: 登录验证
# cherry-pick 后
git cherry-pick a1b2c3d
# 新提交 ID 是 x9y8z7w(不同!)
- 提交内容相同,但提交 ID 会改变
- 提交时间也会是当前时间
5.3 常用别名设置
bash
git config --global alias.cp "cherry-pick"
git config --global alias.cpn "cherry-pick -n"
# 使用别名
git cp a1b2c3d
git cpn a1b2c3d
6. 小结
| 需求 | 命令 | 说明 |
|---|---|---|
| 挑选单个提交 | git cherry-pick <commit> |
最常用,复制指定提交 |
| 挑选多个提交 | git cherry-pick <c1> <c2> |
按顺序复制多个 |
| 挑选范围 | git cherry-pick A..B |
复制 A 之后到 B 的提交 |
| 只暂存不提交 | git cherry-pick -n <commit> |
可继续修改或添加其他变更 |
| 解决冲突后继续 | git add . && git cherry-pick --continue |
继续 |
| 放弃 cherry-pick | git cherry-pick --abort |
恢复到操作前 |
一句话总结 :git cherry-pick 只挑选你需要的提交,而不是整个分支。复制后的提交是"新提交"(ID 不同)。常用于将 bug 修复同步到多个分支,或从错误分支移植提交。**