1.概述
git cherry-pick可以理解为"挑拣"提交,它会获取某一个分支的单笔/多笔提交,并作为一个新的提交引入到你当前分支上。 当我们需要在本地合入其他分支的提交时,如果我们不想对整个分支进行合并,而是只想将某一次提交合入到本地当前分支上,那么就要使用git cherry-pick
了。
2.场景图
如上,在master
分支上开发项目。完成了一个稳定版本,我们需要发布,于是新建了一个Stable/1.x
分支(这个时候该分支代码和主分支代码是一样的),并且把给这次版本打了一个标记Release tag 1.0
(不熟悉tag
的参见我这篇文章)。然后分布Stable/1.x
分支的代码。
之后切换到master
继续开始下一版本的开发。我们有添加了两次功能,并且对Add feature 1
和Add feature 2
这两个功能都做了提交。之后,我们发现项目有一个地方有bug
,于是我们修复bug
并且又做了一次提交(fix bug
)。但这个bug
是Stable/1.x
分支也存在的,我们想要在Stable/1.x
分支合并master
分支的代码,当通过merge
合并代码,会把master
分支所有的提交都会进行合并,包括Add feature 1
和Add feature 2
,这不是我们希望的结果。
于是,我们用到了git cherry-pick 版本hash值
。它可以只将某一次提交合入到本地当前分支上。
3.示例
现在有一个项目,里面有一个文件hello.txt
内容如下:
这个时候我们想要发布项目。于是我们新建了一个分支Stable1
(记得git init
初始化):
然后回到master
分支继续进行下一阶段的开发:
新建一个文件feature.txt
进行下一功能(功能a
)的开发,并且提交:
新建一个文件featureb.txt
进行下一功能(功能b
)的开发,并且提交:
然后突然发现有个新bug
需要修复,于是在hello.txt
中修复bug
,并且提交:
这个bug
是stable1
分支也存在的,我们想要在stable1
分支合并master
分支中关于fix bug
的代码,不希望合并master
分支中关于add feature/a
和add feature/b
的代码。这时候需要用cherry-pick
。
在master
分支打印版本记录,然后我们切换到stable1
分支:
进行cherry-pick
此时在stable1
分支,可以看到项目中没有feature.txt
、featureb.txt
文件,说明并没有合并add feature/a
和add feature/b
。
打开hello.txt
:
上图说明stable1
分支合并了master
分支中的fix bug
提交。