前言

最近在发版的时候遇到一个头疼的问题,就是develop开发分支上的一个功能暂时还不能上线,但是其他的功能提交需要上线,此时平时常用的merge合并就不太行了。

为此老大提了一个新的合并方式:git cherry-pick,这个我之前都没有使用过,它的作用就是可以提取其他分支的指定commit进行合并,这样就可以跳过不能上线的功能提交了。

教程

没有图,在b站视频上偷了一张图来用。

可以看到我们有两列分支,左边的12357就是主分支,右边的468就是开发的新功能,但是6这个提交不能进行合并,我们需要提取4和8合并到主分支。

在cherry-pick之前我们需要将分支切换到main分支,因为最终代码需要合并到这个分支里,所以先切换到这个分支。

git checkout main

我们有两种方式来进行操作。

vscode插件可视化操作

首先我们需要安装插件:GitLens

安装完毕后我们进入到git页面,打开里面的BRANCHES折叠菜单,可以看到有仓库对应的分支信息。

我们展开develop分支,找到需要合并的提交记录,右键 --> Cherry Pick Commit,此时会弹出三个选项,从上倒下分别是:

  1. Cherry Pick
  2. Cherry Pick & Edit
  3. Cherry Pick without Committing

第一个Cherry Pick就是直接将这个提交合并到main分支中。

第二个Cherry Pick & Edit表示我要合并,但是我要修改commit信息。

第三个Cherry Pick without Committing 表示我要将此次提交合并到main分支的暂存区,我们还可以二次修改,确认没问题手动提交到main分支。

大家可以根据自身情况动态选择。

使用这种可视化的方式,一次只能提取单个,没办法多个,如果需要多个,就一个个操作。

命令方式

命令的方式非常灵活,你可以选择单个,也可以选择多个,甚至选择区间范围。

不管是命令还是可视化,你都要先切换到合并的分支,而不是被合并的分支,这个开头也说了。

Cherry Pick 单个

git cherry-pick <commit-hash>

<commit-hash>就是提交的这次hash名,这个就不多说了。

Cherry Pick 多个

git cherry-pick <commit-hash> <commit2-hash> <commit2-hash>

用空格分隔hash名

Cherry Pick 指定区间内的

比如我们上面的分支图,右侧有三个提交分别是:4、6、8;如果我只需要4和8中间的部分,这里中间的部分就是6了。假如提交是:4、5、6、8;那么中间的就是5和6会被合并。

git cherry-pick <commitA-hash>..<commitB-hash>

commitA-hash就是4的hash,<commitB-hash>就是8的hash,中间用..关联。

Cherry Pick 指定范围

除了区间,我们还可以指定一个范围,还是三个提交:4、6、8;我只需要指定头和尾,合并时会将头和尾以及中间部分全部合并。

git cherry-pick <commitA-hash>^..<commitB-hash>

Cherry Pick 多个出现冲突

当你合并多个提交时,大概率会出现冲突的情况,你可以将冲突解决并提交到暂存区后,运行这个命令继续执行下一个cherry pick。

git cherry-pick --continue

每次解决完冲突都要运行一次这个,可以理解为这个就是下一步。

回车运行后会进入到本次pick的commit界面,如果没啥改动直接ctrl+o保存或者ctrl+x退出编辑器,然后按esc,接着用英文输入::wq回车即可,这是保存并退出,如果不想保存就用:q!强制退出。

此时就会进入下一个cherry-pick,存在冲突就解决冲突提交到暂存,如此重复处理。

取消

取消还未提交的 cherry-pick

git cherry-pick --abort

取消已提交的

那就直接 revert 或者 reset 回退处理就行了。

分类: Git 笔记 标签: gitcherry-pick提取合并

评论

全部评论 2

  1. 烟雨
    烟雨
    Google Chrome Windows 10
    你好,站长,上传图片添加水印的插件是啥,我也用的Typecho搭建的[脱单doge]
    1. 木灵鱼儿
      木灵鱼儿
      FireFox Windows 10
      @烟雨腾讯云的oss带的图片处理功能,配合URLReplace 插件实现的

目录