git cherry-pick 使用指南

本文介绍了如何使用 Git 的 cherry-pick 命令来选择性地将一个分支中的特定提交应用到另一个分支中,包括解决冲突的方法及批量 cherry-pick 的用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

git cherry-pick可以选择某一个分支中的一个或几个commit(s)来进行操作。例如,假设我们有个稳定版本的分支,叫v2.0,另外还有个开发版本的分支v3.0,我们不能直接把两个分支合并,这样会导致稳定版本混乱,但是又想增加一个v3.0中的功能到v2.0中,这里就可以使用cherry-pick了,其实也就是对已经存在的commit 进行再次提交.


简单用法:
git cherry-pick <commit id>
注意:当执行完 cherry-pick 以后,将会生成一个新的提交;这个新的提交的哈希值和原来的不同,但标识名一样;

例如:
$ git checkout v2.0分支
$ git cherry-pick 38361a55 # 这个 38361a55 号码,位于v3.0分支中:

$ git log
commit 38361a55138140827b31b72f8bbfd88b3705d77a
Author: Justin Justin@xxx.com
Date: Sat Dec 10 00:11:44 2016 +0800

1. 如果顺利,就会正常提交。结果:

Finished one cherry-pick.
On branch v2.0分支
Your branch is ahead of 'origin/old_cc' by 3 commits.

2. 如果在cherry-pick 的过程中出现了冲突

Automatic cherry-pick failed.
After resolving the conflicts,mark the corrected paths with 'git add <paths>' or 'git rm <paths>'and commit the result with:
git commit -c 15a2b6c61927e5aed6111de89ad9dafba939a90b
或者:
error: could not apply 0549563... dev
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'

就跟普通的冲突一样,手工解决:

2.1 $ git status # 看哪些文件出现冲突

both modified: app/models/MainActivity.java

2.2 $ vim app/models/MainActivity.java # 手动解决它。

2.3 $ git add app/models/MainActivity.java

2.4 git commit -c <新的commit号码>

2.5 再次cherry-pick剩余commit

若提示:

error: a cherry-pick or revert is already in progress
hint: try "git cherry-pick (--continue | --quit | --abort)"
fatal: cherry-pick failed

则执行对应操作:

git cherry-pick --continue
git cherry-pick --quit
git cherry-pick --abort


命令集合:

  • git cherry-pick <commit id>:单独合并一个提交
  • git cherry-pick -x <commit id>:同上,不同点:保留原提交者信息。
    Git从1.7.2版本开始支持批量cherry-pick,就是一次可以cherry-pick一个区间的commit。
  • git cherry-pick <start-commit-id>..<end-commit-id>
  • git cherry-pick <start-commit-id>^..<end-commit-id>

前者表示把<start-commit-id>到<end-commit-id>之间(左开右闭,不包含start-commit-id)的提交cherry-pick到当前分支;
后者有"^"标志的表示把<start-commit-id>到<end-commit-id>之间(闭区间,包含start-commit-id)的提交cherry-pick到当前分支。
其中,<start-commit-id>到<end-commit-id>只需要commit-id的前6位即可,并且<start-commit-id>在时间上必须早于<end-commit-id>
注:以上合并,需要手动push代码。

from: http://www.jianshu.com/p/08c3f1804b36

<think>好的,用户让我介绍一下git cherry-pick的示例。首先,我需要回想一下自己对cherry-pick的理解。记得cherry-pick是用于将某个分支上的特定提交应用到当前分支上。这个命令在需要选择性合并某些提交时很有用,比如当不想合并整个分支,而只需要某个修复或功能时。 接下来,我需要考虑用户可能的背景。他们可能已经了解基本的git操作,如commit、branch、merge,但可能不熟悉更高级的命令。所以应该从基本用法开始,逐步深入,给出实际例子,这样更容易理解。 然后,我得确定回答的结构。首先解释cherry-pick的作用,然后给出基本语法,接着举几个典型的示例。比如选择单个提交、多个提交,处理冲突的情况,以及应用提交到另一个分支。每个示例需要具体步骤,说明命令和执行后的结果。 还要注意提醒用户常见问题,比如提交哈希的获取,冲突解决的方法,以及使用cherry-pick的最佳实践,比如谨慎使用,避免重复提交等。这样用户在使用时能避免一些陷阱。 另外,需要检查是否有错误。比如,在示例中是否用正确的命令格式,步骤是否合理。例如,使用git cherry-pick <commit-hash>是否正确,处理冲突后的步骤是否正确,是否需要commit等。 可能用户在使用cherry-pick时遇到的常见问题包括提交冲突,或者选错提交哈希,所以这部分需要详细说明。同时,要提到如何查看提交历史,获取哈希值,比如git log的使用。 还要考虑用户的需求场景。比如,他们可能需要在不同分支间移植特定的提交,比如修复bug的提交应用到生产分支,而不合并整个开发分支。这种情况下cherry-pick就很有用。 最后,总结一下cherry-pick的适用场景和注意事项,确保用户知道何时使用以及潜在的风险,比如可能导致重复提交或破坏分支历史。需要建议在团队协作中谨慎使用,避免混淆。 现在把这些思路整理成一个结构化的回答,分点说明,用示例和步骤来展示,确保清晰易懂。同时,注意使用中文,避免专业术语过于晦涩,必要时进行解释。</think>以下是一个清晰的 `git cherry-pick` 使用指南,通过示例说明其典型使用场景: --- ### 基础概念 `git cherry-pick` 用于将 **指定提交** 的修改内容复制到当前分支,类似"摘樱桃"选择性地移植提交。 --- ### 典型场景示例 #### 示例1:移植单个提交 ```bash # 查看提交历史,找到目标提交的哈希值(如 abc123) git log --oneline # 切换到要接收修改的分支(如 dev 分支) git checkout dev # 将提交 abc123 应用到当前分支 git cherry-pick abc123 ``` ▸ 效果:`abc123` 的修改会作为新提交出现在 `dev` 分支(新提交哈希不同) --- #### 示例2:移植连续多个提交 ```bash # 将提交 abc123 到 def456 之间的所有修改(左开右闭)应用到当前分支 git cherry-pick abc123^..def456 ``` ▸ 注意:`^` 符号表示从 `abc123` 的下一个提交开始 --- #### 示例3:处理代码冲突 ```bash # 发生冲突时,手动解决冲突文件 git status # 查看冲突文件 # 标记冲突已解决 git add <file> # 继续完成 cherry-pick git cherry-pick --continue # 或放弃操作 git cherry-pick --abort ``` --- #### 示例4:从其他分支移植提交 ```bash # 假设 hotfix 分支的提交 xyz789 需要应用到 main 分支 git checkout main git cherry-pick xyz789 ``` --- ### 使用技巧 1. **查看提交哈希**:`git log --oneline --graph` 可视化分支历史 2. **批量操作**:`git cherry-pick A B C` 可依次应用多个提交 3. **无提交记录**:`git cherry-pick -n` 仅修改工作区不自动提交 --- ### 注意事项 ⚠️ **破坏历史风险**:过度使用会导致分支历史混乱 ✅ **最佳实践**:优先用 `merge` 或 `rebase` 合并完整分支,仅特殊场景使用 cherry-pick 🔍 **重复提交检查**:使用 `git cherry` 可查看待移植提交是否已存在 通过这种选择性移植提交的能力,可以灵活处理如热修复(hotfix)移植、功能分支代码复用等场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值