1.背景介绍
为何要写这样一篇
大多数开发在工作之初应该都经历过这样一段,在开发完一个需求,走完测试,预发流程需要上线的时候,会被前辈提醒,线上环境的影响面,合并代码的时候要特别小心,不要出错;上线的流程一般有一个灰度,和正式的步骤,这两个环境涉及到两个分支,往往因为多人的参与,代码提交记录具有不小的差异性;外加生产环境,正式流量,服务稳定性,故障复盘...这些名词的加持下,导致新人对这个环节更加紧张了,可能对本来自己开发时随便使用的方式都不太自信了。
这个问题最好的方式是通过进一步了解git的相关知识之后,无论面对什么样场景合并代码都没有压力。当然这样的话,需要花的时间更多,往往我们需要查这些相关问题的解决办法的时候,就是临近上线的时候,没有那么多时间去做了解;下面是总结的一套快速上手代码合并的方法。
2.将自己的代码合并入线上分支
一般情况下,线上分支有两个 灰度 和正式分支。流程规范的情况下,分支出现不一致,往往master分支是落后于灰度分支的。也有少数情况出现正式领先的情况(bug fix之类的),为了不出现因为合并了别人的代码,遇上环境不一致的场景导致线上问题,给自己本次需求带来额外的工作量,最好的办法就是:
将灰度和正式分支单独看待和合并处理,不做交叉的处理。记住一点,你上线的目的是为了让你的代码上线,不管是灰度的小流量,还是正式的全量,不同的环节,将自己的代码合并到对应的分支上就行。
2.1.将自己的代码合并入灰度分支的步骤
1、将分支切换到gray分支
git checkout 【gray_branch】
2、更新最新gray分支,保持本地gray分支代码与远端保持一致
git pull
3、接下来有两种方式合并代码
a、直接合并入gray分支,有冲突解决冲突,若冲突不好解决想放弃,也可放弃本次合并
git merge 【dev_branch】
b、若是对a类方法合并有所顾虑,担心解决冲突有问题,影响到线上分支,可以在本地基于自己的开发分支复制一个分支,将gray分支合并到这个复制分支----目的是 不要污染本地开发分支,确保自己的开发分支只有自己的代码----(当然也可以选择copy gray分支用来合并入自己的代码),再将解决完冲突的代码合并到gray分支。
git checkout 【dev_branch】
git checkout -b 【dev_branch_copy】/ git switch -c 【dev_branch_copy】
git merge 【gray_branch】
git checkout 【gray_branch】
git merge 【dev_branch_copy】
2.2将自己的代码合并入线上分支
和合并入gray分支的步骤一样,需要注意的是,如果合并入gray分支的步骤3采取的是copy本地开发分支的方式,这儿也需要基于原开发分支copy一个新的分支来操作。
3.将合并后的代码推送到远端
若需要进行code review ,使用下面的命令,触发cr单链接
git push origin 【local_branch】:refs/for/【remote_branch】
与上面命令相对的不需要进行code review的一个命令
git push origin 【local_branch】:refs/heads/【remote_branch】
该命令的简写就是最常用的 git push
git push 是省略了git push origin 【local_branch】:【remote_branch】
【remote_branch】在git配置里往往是 /refs/heads/【remote_branch】
如 /refs/heads/master。
4.若在合并代码的时候遇见不好解决的冲突,想放弃本次合并
若是使用git merge方式,放弃合并使用
git merge --abort
若是使用git rebase方式,放弃合并使用
git rebase --abort
5.一些问题解答
若没有以下问题,本小节可跳过。
5.1.关于gray分支领先master分支版本,或者master分支领先gray(少数情况bug fix之类)带来的合并代码困难
将灰度和正式环境单独看待,上灰,合并代码的目标就是将自己的代码合并到灰度分支;全量正式,就是将自己代码合并到正式分支。各个环节(灰度,全量)合并到对应的分支。
对于master领先的情况,又需要将master的代码同步到灰度,个人感觉优雅一点的做法是将master rebase到开发分支,然后再将开发分支merge到gray分支上
5.2.合并代码的场景方式列举
只做列举,不详细展开,感兴趣可去查对应的相关命令使用文档
i.合并特定的提交到当前分支
cherry-pick 【commit_id】
ii.合并特定的文件到当前分支
git checkout --patch 【source_branch】【file_name】
iii.合并特定分支
git merge 【source_branch】
git rebase 【source_branch】
5.3.git merge和git rebase的区别
git merge是无论【source_branch】做了多少commit,合并之后只会在当前分支形成一个新的commit。
merge本质是将两分支共同祖先节点之后【source_branch】的改动合并成一个提交到当前分支
git rebase是在【source_branch】和当前分支的共同祖先节点之后放入【source_branch】的所有commit,然后再将当前分支的commit放在这之后。