MENU

git cherry-pick合并某个commit

May 11, 2020 • GIT

在一般的项目开发过程中,我们一般在开发分支(develop)上提交,等项目开发完成后我们在使用merge命令合并到主分支(master)上。

但是可能会出现这样的一种情况在develop的开发过程中项目希望提前使用到develop分支上的一个新功能,而不想把develop还没开发完成的其他功能一起提交上线,那么这样的情况我们就需要使用到cherry-pick命令了。

9ND4.png

简述

cherry-pick这个命令和merge很类似,但是cherry-pick操作的对象是commit,就是对已经存在的commit 进行再次提交。

使用方式也很简单:

git cherry-pick <commit id>

commitid我们可以使用git log命令来查看到。

实践

简单介绍一下提交流程:

首先我们切换到develop分支上,然后我们新增3个提交

git checkout develop
git commit -m "add 内存配置"
git commit -m "add 硬盘配置"
git commit -m "add 显卡配置"

提交日志如下
9VnW.png

接着我们切换到master分支上,再次查询下日志

9aEM.png

我们现在要做的就是把add内存配置(0321b70)add 硬盘配置(0f16d73)合并到master分支上,多余的那个add 显卡配置(1e1aa1f)我们模拟开发尚未完成的功能,先不合并。

{ maxrnb } master » git cherry-pick 0321b70 0f16d73                                 
[master 9ae7418] add 内存配置
 Date: Mon May 11 10:00:29 2020 +0800
 1 file changed, 2 insertions(+), 1 deletion(-)
[master fbdfe5d] add 硬盘配置
 Date: Mon May 11 10:01:04 2020 +0800
 1 file changed, 2 insertions(+), 1 deletion(-)
{ maxrnb } master » 

可以看到使用cherry-pick的合并是在master分支上新生成了一个commit,对应的commitid分别为9ae7418fbdfe5d,并不是我们平常使用的Fast-forward合并模式。我们从log里也可以很清楚的看到

92Cf.png

扩展

刚刚是一个或者两个提交cherry-pick到master分支,但如果有100个commit要合并到master分支呢?总不能这样一个个操作吧?cherry-pick还提供了一个方便合并区间的方式。

git cherry-pick commit1..commit100

但是要注意,这是一个左开右闭的操作,也就是说,commit1不会被合并到master分支,而commit100则会。

刚刚上面也说了,cherry-pick每拣选一个commit就会提交一次生成一个新的commit。 如果我们想让每个commit 拣选后暂缓提交,等到所有commit都拣选完成后,自己手动commit,应该怎么办呢?可以采用-n选项来操作。
9UOo.png

这个时候,我们查看log的话发现log图谱中并没有出现新的commit,所以我们继续合并,最后手动执行git commit -m "合并 添加内存、添加硬盘提交"

最后,log图谱如下。可以很清楚看到虽然我们抽取了2次commit来合并,但是最终在master上只产生了一个新的commit,对应着图谱中的f24a43f

9oYR.png

问题

有的人(比如我)可能会有这样的操作,cherry-pick后面跟一系列commitid最后的一个。按照上面的列子我执行

git cherry-pick 0f16d73会怎么样?

96ts.png
冲突内容如下

<<<<<<< HEAD
CPU: i5-7200U
=======
CPU: i5-7200U
Merory: 芝奇16G x 2
DIsk: 三星970Evo Pro
>>>>>>> 0f16d73... add 硬盘配置

这样操作的话会出现冲突,但是同样可以通过和解决普通冲突一样来操作。不过还是建议通过cherry-pick后面跟一个或多个commitid来操作规范。

总结

cherry-pick这个命令我个人平时工作中使用到的情况还是比较少的,使用的更多的依然是merge。但是这cherry-pick有更高的灵活性及更强大的自定义性。

cherry-pick合并提交的时候是生成了新的commitid并不是Fast-forward合并模式,这点需要注意。

题图引用: https://medium.com/faun/awesome-git-technique-for-partial-merge-7d64a7e62440

文章部分参考: https://zhuanlan.zhihu.com/p/58962086

Leave a Comment

3 Comments
  1. 迁移到Ucloud测试

    1. @lepigme@gmail.com测试回复 哈哈@(吐舌)

    2. @lepigme@gmail.com阿里云添加发信白名单后测试@(你懂的)