git cherry-pick

文章目录

  • [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-pickmerge 的区别)
    • [5.2 复制的是新提交,不是原提交](#5.2 复制的是新提交,不是原提交)
    • [5.3 常用别名设置](#5.3 常用别名设置)
  • [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-pickmerge 的区别

对比维度 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 修复同步到多个分支,或从错误分支移植提交。**


参考文献

Git - git-cherry-pick Documentation

相关推荐
Geek-Chow7 小时前
Git 标签与发布流程:轻量标签、附注标签与签名标签
git·tags
wear工程师7 小时前
Git 冲突怎么解决:别只删标记,先看懂暂存区的 1、2、3 阶段
git
村雨遥7 小时前
覆盖提交不等于删除,这才是彻底清除 Git 历史的正确姿势
git·github
淮北4948 小时前
ubuntu22 默认输入法调整频率
运维·服务器·git·ubuntu·elasticsearch
dunge20269 小时前
2026 ChatGPT Plus / Pro + Codex 实战:从 0 搭一套 AI 编程项目模板,AGENTS.md + Git + 测试一次配好
人工智能·git·chatgpt
福如意如我心意1 天前
git清除仓库敏感文件并同步至远端的操作
git
Brilliantwxx1 天前
【Linux】 开发|Git 版本控制与 gdb/cgdb 调试
linux·笔记·git
.Hypocritical.2 天前
Git 全套实操|配置 /.gitignore/ 分支合并 / 冲突解决 /git stash 完整教程
git
来日方长。。。。long2 天前
Hermes Agent橙皮书共读|第三篇:保姆级实战部署|本地/VPS从零搭建Hermes
ide·git·hermes
其实防守也摸鱼2 天前
VS Code Git 工作树:解锁多分支并行开发新体验
数据库·git·安全·oracle·架构·自动化