文章目录
git cherry-pick 是 Git 中一个非常实用但需谨慎使用的命令,它允许你**选择某个分支上的一个或多个提交(commits),并将它们"复制"到当前分支上。**这在修复 bug、同步特定功能或从错误分支提取更改时特别有用。
一、基本概念
不是合并(merge) :cherry-pick 不会合并整个分支历史,而是复制指定提交的变更内容 ,生成新的提交(commit hash 会变)。
适用场景:
- 把 hotfix 提交从 main 应用到 develop
- 从 feature 分支提取某个关键 commit 到 release 分支
- 撤销某次提交后又想恢复其部分逻辑
二、基本语法
bash
# 挑选单个提交
git cherry-pick <commit-hash>
# 挑选多个提交(按顺序应用)
git cherry-pick <hash1> <hash2> <hash3>
# 挑选一个范围内的提交(注意:不包含起始 commit)
git cherry-pick <start-commit>..<end-commit>
# 例如:git cherry-pick abc123..def456 → 应用 (abc123, def456] 之间的提交
# 挑选包含起始提交的范围(使用 ^!)
git cherry-pick <commit>^..<end> # 包含 <commit>
A...B 表示 "从 A 之后到 B(含)",即 不包含 A。
三、详细使用示例
场景:从 feature/login 分支提取一个安全修复提交到 main
bash
# 1. 切换到目标分支
git checkout main
# 2. 查看 feature 分支的提交历史
git log --oneline feature/login
# 输出:
# a1b2c3d (HEAD -> feature/login) Optimize login UI
# e4f5g6h Fix password validation logic ← 我们要这个
# i7j8k9l Add login page
# 3. cherry-pick 这个提交
git cherry-pick e4f5g6h
# 4. 如果无冲突,自动创建新提交;如果有冲突,需手动解决
执行后,main 分支会新增一个内容相同但 hash 不同的提交(比如 x9y8z7w),描述和原提交一致。
四、常用选项(Options)
| 选项 | 作用 |
|---|---|
| -n 或 --no-commit | 应用更改但不自动提交,方便后续修改或组合多个 commit |
| -e 或 --edit | 在提交前编辑提交信息 |
| -x | 在提交信息末尾自动添加 (cherry picked from commit ...),便于追踪来源(推荐用于公共分支) |
| --signoff | 添加 Signed-off-by 签名 |
| -m < parent-number > | 用于 cherry-pick 合并提交(merge commit),指定以哪个父提交为基准 |
五、处理冲突
如果 cherry-pick 的更改与当前分支有冲突:
- Git 会暂停并提示冲突文件
- 手动编辑冲突文件(类似 merge 冲突)
- 使用 git add < file > 标记已解决
- 继续 cherry-pick:
bash
git cherry-pick --continue
- 若想放弃:
bash
git cherry-pick --abort
六、高级技巧
1.Cherry-pick多个连续提交
bash
# 应用从 A 到 D 的所有提交(不包含 A)
git cherry-pick A..D
# 等价于:
git cherry-pick B C D
2.Cherry-pick合并提交(Merge Commit)
合并提交有多个父节点,需指定 -m:
bash
git cherry-pick -m 1 <merge-commit-hash>
- -m 1 表示以第一个父提交为基准(通常是主干分支)
- -m 2 表示以第二个父提交为基准(通常是 feature 分支)
cherry-pick 合并提交通常不推荐,容易出错。建议 cherry-pick 被合并的普通提交。
3. 批量 cherry-pick 并 squash 成一个提交
bash
git cherry-pick -n <hash1> <hash2> <hash3> # 不提交
git commit -m "Combined fixes from feature X"
七、注意事项 & 最佳实践
| 风险/建议 | 说明 |
|---|---|
| 不要对已推送的公共分支频繁 cherry-pick | 会导致重复提交,历史混乱 |
| 优先使用 git merge 或 git rebase | 如果是要同步整个分支,merge/rebase 更合适 |
| 使用 -x 记录来源 | 尤其在团队协作中,便于追溯 |
| 避免 cherry-pick 同一个提交多次 | 可能导致重复代码 |
| cherry-pick 不会复制未提交的更改 | 只作用于已提交的 commit |