笔名: haibiscuit
博客园: https://www.cnblogs.com/haibiscuit/
Git地址: https://github.com/haibiscuit?tab=repositories (欢迎star)
本项目地址: https://github.com/haibiscuit/StudyBook
尊重笔者的劳动成果,未经允许请不要转载
三:git cherry-pick与git merge
前言:
git cherry-pick不能合并其它分支上git merge的提交版本修改,只能合并正常使用git commit提交的版本修改
作用:
相同点:
(1) git cherry-pick和git merge都是将其他分支修改的内容合并到当前分支,也就是都是执行合并修改的操作.
(2) 操作后都会提交新的版本
不同点:
(1) git cherry是其他分支的指定提交节点所修改的内容合并到当前的分支
git merge是其他分支与当前分支在上一次执行合并操作的提交或者两个分支在与master主分支提交的节点之后所有的修改进行合并
举例:(上面的内容可以不看,讲的有点复杂,下面通过操作来理解这连个操作)
(上图描述:左边是dev分支,右边是test分支,左边分支提交了一个版本c1,右边分支提交了俩个版本c2,c3)
具体操作如下:
(1) //在dev分支创建文件dev_test1.txt文件,并提交为c1节点
git checkout dev //切换到dev分支
touch dev_test1.txt //dev分支上创建dev_test1.txt文件
git add .&&git commit -m "c1" //提交修改为c1节点
(2) //在test分支创建文件test_test1.txt文件,并提交为c2节点
//然后再创建test_test2.txt文件,并提交为c3节点
//首先test分支上提交c2节点
git checkout test //切换到test分支
touch test_test1.txt //test分支上创建test_test1.txt文件
git add .&&git commit -m "c2" //提交修改为c2节点
//其次test分支上提交c3节点
touch test_test2.txt //test分支上创建test_test2.txt文件
git add .&&git commit -m "c3" //提交修改为c3节点
(3) 在dev分支上进行git cherry-pick和git merge比较
//首先切换到dev分支
git checkout dev //切换到dev分支
//使用git cherry-pick测试
git cherry-pick test //将test分支最新提交节点(c3节点)的修改合并到当前分支
//使用git merge测试
git reset --hard HEAD^ //回退到dev分支的上一个节点,消除git cherry-pick test操作结果的影响
git merge test //将test分支最新版本节点从master节点之后所有的提交修改都合并到当前节点
(4) 测试结果
//使用git cherry-pick test测试结果
dev分支上只有dev_test1.txt和test_test2.txt两个文件,也就是我们在test分支上最新一次的提交是创建test_test2.txt,并没有合并c1版本创建的test_test1.txt文件
//使用git merge test
dev分支上出现dev_test1.txt和test_test1.txt和test_test2.txt三个文件,说明自master版本之后的所有提交的修改都被合并到dev分支
使用场景:
git cherry-pick适合合并其它分支的一个版本节点所作的修改,之前和之后的提交都不会合并
git merge适合将两个分支自分叉之后或者是一次合并之后的所有提交版本的合并,这个还是非常常用的
正确的使用姿势:
(1) git cherry-pick操作
git cherry-pick 分支名
//代表将分支最新版本提交所作的修改合并到但情感的分支,分支名也可以是版本号
(2) git merge操作
git merge --no-ff -m "提交信息" 分支名
//这里使用使用--no-ff主要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。