对于多分支的代码库,常常要将代码从一个分支转移到另一个分支。如果需要另一个分支的所有代码变动,那么就使用合并——git merge;如果只需要部分代码变动(某几个提交),这时可以使用 cherry pick

git cherry-pick 会获取某一个分支的单笔提交,并作为一个新的提交引入到你当前的分支上。

使用场景:

例如,现在我们有一个稳定版本的分支 version 1.0,另外还有个开发版本的分支 version 2.0。version 2.0 开发了多个功能,但现在只需要增加某一个功能到 version 1.0,这里就可以使用 cherry-pick 命令,将这个功能相关的 commit 提取出来,合入到稳定版本的分支上。

用法:

基本命令:

$ git cherry-pick <commit-id>

其中,commit-id 是某次提交的哈希码,使用 git log 能够查到。

当执行完 cherry-pick 之后,将会自动生成一个新的 commit 进行提交,也就是会有一个新的 commit-id

举个例子,代码仓库有 master 和 zk 两个分支,如下

a - b - c - d   master
     \
       e - f - g zk

现在,我们将提交 f 应用到 master 分支:

# 切换到 master 分支
$ git checkout master
 
# Cherry pick 操作
$ git cherry-pick f

操作成功后,代码库变为

a - b - c - d - f   master
     \
       e - f - g zk

分支名也可以作为 git cherry-pick 的参数,表示转移该分支的最新提交,如下

$ git cherry-pick feature

如果顺利的话,正常提交后回达到上面的效果。如果遇到冲突,使用 git diff 解决冲突即可,工作中,不推荐手工解决冲突,最好还是使用一些 diff工具来处理。

转移多个提交

转移两个提交:

$ git cherry-pick <commit-idA> <commit-idB>

转移一系列提交:

$ git cherry-pick A..B # (1)
$ git cherry-pick A^..B # (2)

注:

  • 上面的命令可以转移从 A 到 B 的所有提交。这一系列的哈希码需要按提交时间先后排列, 即最先提交的 commit 放在前面,否则命令将失败,但不会报错。
  • 使用命令 (1) ,提交 A 不会包含在 cherry pick 中,相当于左开右闭区间;使用命令 (2) ,提交 A 将会包含在 cherry pick 中。
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐