前言
git cherry-pick是git中比较有用的命令,cherry是樱桃,cherry-pick就是挑樱桃,从一堆樱桃中挑选自己喜欢的樱桃,在git中就是多次commit中挑选一个或者几个commit出来,也可以理解为把特定的commit复制到一个新分支上。
应用场景
commit 都提交了,为什么还要复制新的出来?
应用场景1:有时候版本的一些优化需求开发到一半,可能其中某一个开发完的需求要临时上,或者某些原因导致待开发的需求卡住了已开发完成的需求上线。这时候就需要把 commit 抽出来,单独处理。
应用场景2:有时候开发分支中的代码记录被污染了,导致开发分支合到线上分支有问题,这时就需要拉一条干净的开发分支,再从旧的开发分支中,把 commit 复制到新分支。
命令使用
复制单个
现在有一条feature_cherrypick分支,commit 记录如下:
commit 09cc27103ea4b5ec6f9827e41583e3f0fdbb5efb (HEAD -> feature_cherrypick, origin/feature_cherrypick)
Author: aiqinhai <aiqinhai@qq.com>
Date: Fri Sep 22 21:20:39 2023 +0800
[修改代码]cherryPick第六次
需要把 09cc27103ea4b5ec6f9827e41583e3f0fdbb5efb 这次commit复制到另一个分支,首先把 commitHash 复制下来,然后切到 master 分支。master分支当前在cherryPick3()这个版本,使用cherry-pick把 09cc27103ea4b5ec6f9827e41583e3f0fdbb5efb commit应用到当前分支。由于feature_cherrypick分支和master分支差三个分支,在进行git cherry-pick之后出现冲突,这时候进行冲突解决即可。
复制多个
以上是单个 commit 的复制,下面再来看看 cherry-pick 多个 commit 要如何操作。一次转移多个提交:
git cherry-pick commit1 commit2
上面的命令将 commit1 和 commit2 两个提交应用到当前分支。多个连续的commit,也可区间复制:
git cherry-pick commit1^..commit2
上面的命令将 commit1 到 commit2 这个区间的 commit 都应用到当前分支(包含commit1、commit2),commit1 是最早的提交。比如说feature_cherrypick分支,有如下三个commit.
commit 668a7ca5daabd8dedbdfdc15e9abad912adc6414
Author: aiqinhai <aiqinhai@qq.com>
Date: Fri Sep 22 20:52:36 2023 +0800
[修改代码]cherryPick第三次
commit 5b303cc62fcd3d3121619d1163f2ec3392d65b7c
Author: aiqinhai <aiqinhai@qq.com>
Date: Fri Sep 22 20:35:31 2023 +0800
[修改代码]cherryPick第二次
commit 8ffb06b413047d818f920758288491c70c4fa9e4
Author: aiqinhai <aiqinhai@qq.com>
Date: Fri Sep 22 20:33:55 2023 +0800
[修改代码]cherryPick第一次
我们可以一次性将cherryPick第一次至cherryPick第三次三次commit复制新分支feature_app6.6上
应用成功之后,git push到远程分支即可
cherry-pick 代码冲突
在cherry-pick多个commit时,可能会遇到代码冲突,这时cherry-pick会停下来,让用户决定如何继续操作。我们可以解决冲突,然后使用cherry-pick --continue让cherry-pick继续进行下去。把冲突之后的commit也复制进来,整个流程就完成了。但有时候可能需要在代码冲突后,放弃或者退出流程:
放弃 cherry-pick:
git cherry-pick --abort
回到操作前的样子,就像什么都没发生过。
退出 cherry-pick:
git cherry-pick --quit
不回到操作前的样子。即保留已经cherry-pick成功的 commit,并退出cherry-pick流程。