git的cherry-pick合并指定分支

一、背景

在开发项目中, 将个人分支的代码合并到主分支, 或者将dev分支合并到release分支是常见的需求。

合并主要分为两种情况,一种是将分支上所有的commit合并到另一分支, 此时使用git merge即可实现。另一种试讲分支上某几个commit合并到另一分支, 此时就需要使用git cherry-pick来实现部分commit的合并。

二、git cherry-pick的基本用法

git cherry-pick <commitHash>命令是将指定的commit合并到当前所在分支。

举个例子:

上线的项目中突然发生了问题, 我在个人分支修复了该问题, 此时比较紧急需要立马merge到release分支, 重新发布。假设存在release分支和dev-syz分支。需要将dev-syz分支的g合并到release中。

1
2
release分支的commit历史线:a->b->c->d
dev-syz分支的commit历史线: a->b->c->d->e->f->g

注:

1.d为release的最新的commit, g为修复改问题后的commit。

2.由于是修复紧急Bug,因此只想合并g commit。

现在将g commit合并到release分支,操作如下:

1
2
git checkout release
git cherry-pick g

完成上述操作后,release分支和dev-syz分支的最新commit历史线如下:

1
2
release分支的commit历史线:a->b->c->d->g
dev-syz分支的commit历史线: a->b->c->d->e->f->g

从上述结果可以看出,使用git cherry-pick <commitHash>转移指定分支实际上是在release上产生一个新的commit,只不过release上的g和dev-syz的g的 commitHash并不相同,但修改的代码内容是相同的。

三、git cherry-pick合并多个commit

同样,使用git cherry-pick <commitHash1> <commitHash2>可以转移多个指定分支。

如果要转移一连串的commit,可以使用git cherry-pick a..b,意思是转移从commit a到commit b的一段连续的commit。