写在前面
在日常工作中经常会有这样的场景,在正常的功能开发中突然有紧急的bug修改,或者是紧急功能开发上线,在上线时又不能将正在开发中的功能合并到主干,此时我们就需要只合并需要紧急上线的代码到主干,接下来我们就看下这种情况如何处理。
1:cherry-pick
通过git的cherry-pick命令可以选择合并哪个提交id对应的修改到当前分支,接下来详细看下。
假设现在本地有master分支和dev两个分支,如下图:
PS D:\test\test-cherry-pick> git branch -vv
* dev2 64af4de [origin/dev2] modify bbb.txt add 二二二
master 10ac835 [origin/master] modify aaa.ttxt add 一一一
当前我们在
dev2
,当前假设提交记录如下:
PS D:\test\test-cherry-pick> git log -n2 --pretty=oneline
64af4de7d496fff9d68489e7ab6304589f00a0d1 (HEAD -> dev2, origin/dev2) modify bbb.txt add 二二二
5aed452f3bebebd87d6be48388f8dab57037cbb8 modify aaa.ttxt add 一一一
我们希望合并提交ID为
64af4de7d496fff9d68489e7ab6304589f00a0d1
的修改到主干,此时我们需要记下这个提交ID,然后切换到master,如下:
PS D:\test\test-cherry-pick> git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
PS D:\test\test-cherry-pick> git branch
dev2
* master
然后使用命令
git cherry-pick 提交ID
进行合并,如下:
PS D:\test\test-cherry-pick> git cherry-pick 64af4de7d496fff9d68489e7ab6304589f00a0d1
[master 88c7faf] modify bbb.txt add 二二二
Date: Tue May 17 18:07:05 2022 +0800
1 file changed, 2 insertions(+), 1 deletion(-)
然后就可以正常的push合并的信息到远程master了。其他的提交ID也可以通过这种方式来完成合并。在idea中也可以进行这种操作,都是如下的步骤:
1:切换到要合并代码的分支
2:获取要合并的提交,执行cherry-pick。
只不过使用idea是通过界面操作,而不是使用命令罢了,如下我们在
dev2
分支进行了如下修改,先增加了文件
ddd.txt
,然后增加了文件
eee.txt
,产生的提交记录如下:
然后我们将这2次提交通过cherry-pick合并到master,首先切换到master分支:
然后选中项目->git->show history,进入如下界面:
默认显示的是当前分支的提交记录,为了能够看到dev2分支的提交记录,我们将查看历史的分支切换为dev2,如下:
此时就可以看到dev2的提交记录了,如下:
接下来shift选中红框记录,然后右键cherry-pick即可,如下图:
接下来就可以push到远端了。
如果,凡事有如果,cherry-pick本质也是合并代码,如果是合并代码有冲突怎么办呢?会提示失败,此时怎么办呢?如果是idea的话会给出比较友好的提示让我们自己合并,但是个人建议一旦出现冲突,就不要采用cherry-pick方式来合并了,可以考虑使用
2:idea compare功能
方式。
2:idea compare功能
git提供了比较的功能,通过比较我们也可以很方便的合并自己想要合并的内容,按照如下操作:
手动点击中间的
>>
比较合并就可以了,因为是手工,一定要细心,不要合并错了。
3:最佳实践★★★★★
按照如下2种情况:
1:如果是完全独立的修改(修改已有文件,没有其他人修改,或者是新添加的文件),则优先选择使用"1:cherry-pick",至于命令行方式还是idea的GUI方式,根据个人习惯,推荐idea方式,效率高。
2:如果是存在非独立的修改(修改的已有文件也有他人修改且不可合并,或者是添加了不可合并的新文件),使用"2:idea compare功能",虽然效率相对低一些,但是安全性高,不容易出问题,对于新文件,手动CV即可。
版权归原作者 wang0907 所有, 如有侵权,请联系我们删除。