用途

在本地分支合入其他分支时,如果不想对整个分支进行合并,而只想对其中的某一次提交合并到当前本地分支,就需要使用 git cherry-pick 。

应用场景

在实际的项目开发过程中,经常会在版本迭代的过程中,发现一些老版本遗留的问题。这时候,在新版本上针对该问题提交的修复,使用 git cherry-pick 就很容易应用到老版本上了。

例如:我们在某个项目的 feat/1.2.0 版本分支进行开发时,发现了 feat/1.1.0 版本遗留下来的一个问题。我们在 feat/1.2.0版本将其修复之后,还想将该修复应用于 feat/1.1.0 版本,这时候,只需要使用 git cherry-pick 命令即可。

操作流程

假设我们在 feat/1.2.0 分支,并且已经针对 feat/1.1.0分支的问题进行了修复,产生了一次提交 09f76ee4a 。(如何查看提交的哈希序列: git log –oneline -3 , 单行显示最近 3 条提交信息)。

具体流程如下:

  1. 切换到目标分支: git checkout feat/1.1.0
  2. 应用修复: git cherry-pick 09f76ee4a
  3. 应用成功之后直接 git push
  • 如果成功应用修复,会有类似如下信息:
    1
    2
    3
    4
    $ git cherry-pick 09f7ee67e
    [feat/1.1.0 87f15e9ef] fix: xxxxxxxxx
    Date: Wed Sep 4 12:44:49 2019 +0800
    1 file changed, 10 insertions(+), 1 deletion(-)
  • 如果出现如下类似信息:
    1
    2
    3
    4
    5
    git cherry-pick 49006ed7a
    error: could not apply 49006ed7a... fix: xxxxxxxxxx
    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'
    说明出现冲突,需要手动修复(具体流程与 git merge 冲突解决相同)。解决冲突之后,使用 git add 和 git commit 命令手动进行提交。

补充

  • 如果要放弃本地 cherry-pick 恢复到命令执行之前的状态,使用命令 git cherry-pick –abort
  • 如果有多个提交,并且中间过程出现冲突,解决冲突之后,使用 git cherry-pick –continue 继续下一个提交