3月14日晚19点,创顺科技2018年第6期员工分享会顺利召开。本期分享会由配置管理员-朱明杰负责主讲,与全体技术人员分享了项目上线分支管理技术!
项目上线的时候,需要进行一系列有关分支的处理工作。为了明确相关具体的分支处理做法,提升开发效率以及降低上线风险,需明确分支处理规则。
一、分支说明
目前为止,分支分为以下几个类型:
master:主分支,作为所有分支的基础分支。(固定)
develop:运维分支,所有开发分支在发布运维环境的时候,都需要合并到此分支。(固定)
test:测试分支,所有开发分支在发布测试环境的时候,都需要合并到此分支。(固定)
feature:开发分支,包括新增需求分支和线上缺陷修复分支,从master分支上创建。
release:发布分支,发布线上的分支,从develop分支上创建。
svn:SVN交互分支,用于将之前SVN上的代码提交到GIT上而设。(固定)
tag:作为其它分支的一个标记,用于以后对已经删除分支的恢复而设。
分支模式图
二、项目上线流程
在上线的过程中,各个阶段分支的转换流程如下:
上线分支流程图
三、命名规范
分支的命名,不同的分支有不同的格式要求。
主分支:使用固定名称master。
开发分支:开发分支分为新增需求和缺陷修复两种类型的分支。命名格式为:【分支类型】-【项目代号】-【case号】。举例:feature-trj-2118,代表投融家项目case号为2118的新增需求开发分支;bugfix-trj-2119,为投融家项目case号为2119的缺陷修复分支。
测试分支:使用固定名称test。
运维分支:使用固定名称develop。
发布分支:命名格式为:【release】-【项目代号】-【平台类型】-【日期】_【序号】。举例:release-trj-php-20180307_2,代表投融家的php平台的日期为2018年3月7日的第2个发布分支。如果序号为1,则可以不写;如release-trj-php-20180307,代表投融家的php平台的日期为2018年3月7日的第1个发布分支。
tag:命名格式为:tag包含开发分支和发布分支两种类型。命名格式为:
1)开发分支的tag:【分支类型代号】.【case号】。举例:F.2118,代表case号为2118的新增需求分支的tag; B.2119,代表case号为2119的缺陷修复分支的tag。
2)发布分支的tag:R.【日期】_【序号】。举例:R.20180307_2,代表20180307的第2个tag。
注意:tag的日期和序号必须保证与对应的发布分支的日期和序号相同。
四、分支的生命周期
分支从创建到销毁,为尽量减少版本库中所存在的分支数量,提升开发和查询的效率,不同的分支有其不同的生命周期。
分支的生命周期
五、冲突的处理
冲突出现在分支合并或者从线上更新代码这两个过程中。对于冲突的处理,最好使用一些工具进行,这样有助于快速准确的处理。在Windows系统下可以使用tortoise GIT和SourceTree,在Mac下可以使用SourceTree,在Linux系统下可以使用smartgit (具体没用过)进行操作。
场景一:在合并分支或者更新线上代码到本地的时候出现冲突。
Sourcetree下的冲突处理:
1、点击左下角的“文件状态”一栏,进入文件目录,“未暂存文件”框下面的就是出现冲突的文件。对着一个文件,右键“解决冲突”,选择“打开外部合并工具”,就可以打开之前关联的工具Beyond Compare(没有关联需要先关联)。
2、在打开Beyond Compare 后,出现下图页面框:
在页面中有4个小框,代表不同的含义,随机可以查看本地文件夹中多出了BACKUP、BASE、LOCAL、REMOTE四个文件。其中BACKUP、BASE和LOCAL窗口不能编辑。具体含义如下:
BASE窗口:需要合并的两个文件的最近的共同祖先版本
LOCAL窗口:当前分支文件
REMOTE窗口:远程分支文件
OUTPUT窗口:合并之后的文件
3、所有的处理操作都在OUTPUT页面进行,在左侧有小箭头可以选择使用LOCAL还是REMOTE的代码,按“F2”可以对页面进行编辑,完成处理后,点击页面右上角的保存图标,关闭页面即可。
4、之后,在文件目录中之前的四个文件已经消失,但是会出现一个.orig的文件,该文件保留了冲突的原貌,需要手动删除,不要提交到版本库。此时,冲突已经处理完成,只需要提交即可。
TortoiseGIT下的冲突处理:
1、选择项目目录右键“git commit”,之后会出现提交的窗口,红色部分即为冲突部分。
2、选择红色的文件,左键双击打开处理页面。出现的页面中包含三个窗口,分别是Remote分支窗口,本地分支窗口以及处理结果窗口。其中Remote分支和本地分支窗口不能编辑,右键可以选择使用其中一个分支代码;处理结果窗口可以直接进行编辑。
3、页面中的字段有4中颜色,代表不同的含义:黄色代表新增,橙色代表删除,红色代表冲突,白色代表没有变化。处理完成后点击最上面的“Mark as resolved”按钮即可。
六、分支的回滚
在分支上误提交了一些版本想要删除的时候,可以使用分支的回滚功能。
revert:回退该次提交,并创建一个新的提交,回退不会破坏之前的版本历史。
应用场景:适用于回退之前某个特定的版本,并且不想破坏整个版本历史的时候使用。
基本命令:git revert 【版本号前6位】
场景一:误提交了一次代码,一段多余代码没有删除
1、查看版本库历史
2、回滚指定的版本
3、完成后,本地该版本的代码就回滚了,在本地版本库中就出现了回滚的日志,将代码提交到远程仓库即可。
reset:回退提交到特定的版本,会破坏特定版本之后的版本历史。
应用场景:适用于回退到之前特定的版本,并且不需要之后的所有版本的情况。
基本命令:git reset --【参数】 【版本号前6位】
参数包括三种:
--soft – 缓存区和工作目录都不会被改变
--mixed – 默认选项。缓存区和你指定的提交同步,但工作目录不受影响
--hard – 缓存区和工作目录都同步到你指定的提交
场景一:自己的分支不小心合并进了别人分支的代码
查看日志,找出最初的别人分支的代码版本。
通过使用git reset --hard 【版本号】 回滚到该最初版本的前一个版本上。如下图,查看日志可以发现分支已经回滚到最初版本的前一个版本,已经将别人分支的代码删除。
接着需要更新远程分支,首先切换到其它分支通过git push origin -d 【分支名】来删除旧的远程分支;然后再切换回此分支,通过git push origin 【分支名】来创建新的远程分支。这样新的分支就创建成功。
场景二:自己每次修改一点就推送到远程版本库,导致提交碎片过多
通过git reset --soft 【版本号】 回滚到该注释最早的一次。查看状态,可以发现暂存区中有些更新还没有提交,但是本地工作区中的文件没有改变。
然后重新提交代码,查看日志即可发现只有一条记录了。接着删除远程旧分支,将新的分支推送到远程即可。
场景三:根据某个特定的版本创建新的分支
在合并代码后,发布环境的时候发现出现了错误,原因可能是合并代码有问题导致的,如何才能重现问题呢?可以通过回滚这条分支到合并之前的版本然后创建新的分支,再次进行合并来重现问题。
通过hard reset 回滚到合并之前的版本,然后在从此版本创建新的分支。
七、Tag的处理
已经不需要使用的分支,在完成开发后可以通过创建一个tag来进行保存,之后就可以将该分支销毁,以减少服务器的分支数量,提升开发的效率。
基本命令:git tag 【tag的名称】
场景一:根据分支创建tag,并删除该分支
切换到该分支,使用命令git tag F.4000创建tag,并将tag推送到远程。
删除该本地分支和远程分支。
场景二:根据tag恢复已经删除的开发分支
在需要之前已经删除的分支时,可以通过tag进行恢复。使用命令git branch
八、分支更新的处理
在更新分支的时候,出现大量的冲突时,可能是线上分支的变动导致与本地分支版本历史不一致的缘故,如果本地的修改不需要使用的话,可以删除本地分支,重新从线上拉取分支。
在切换分支的时候提示:
可以使用git checkout 【文件绝对路径】 将文件的修改从暂存区退回:
在拉取代码时出现如下图错误,需要先更新本地版本再推送到远程:
在将代码推送到远程分支的时候出现如下错误,需要设置本地分支与远程分支的关联:
九、Git的权限配置
Git提供了一个叫做git config的工具,专门用来配置或读取相对应的工作环境变量。
三种配置方式:
1、/etc/gitconfig 文件:系统中对所有用户都普遍适用的配置。若使用 git config 时用 --system 选项,读写的就是这个文件。
2、~/.gitconfig 文件:用户目录下的配置文件只适用于该用户。若使用 git config 时用 --global 选项,读写的就是这个文件。
3、当前项目的 Git 目录中的配置文件(也就是工作目录中的 .git/config 文件):这里的配置仅仅针对当前项目有效。每一个级别的配置都会覆盖上层的相同配置,所以 .git/config 里的配置会覆盖 /etc/gitconfig 中的同名变量。
一般情况下,我们使用第二种全局配置即可,一个账号的配置可以使用所有有权限的项目。
领取专属 10元无门槛券
私享最新 技术干货