背景

分享一下,我在项目里是怎么使用git分支管理的

一、分支管理方式

gitlab15文档 gitlab做文档管理_gitlab15文档


分支介绍:

  • feature_*分支:需求开发分支
  • dev分支:本地测试分支
  • uat分支:客户测试分支
  • release_*分支:发布分支
  • master分支:主分支
  • hotfix_*分支:热修复分支

其中dev、uat、master分支为长期分支,feature_、release_、hotfix_*为临时分支
简述基本流程:
1、开发从master分支拉取出feature分支;
2、开发在feature分支上做需求开发或bug修复;
3、开发将feature分支合并到dev分支,测试打包发布dev分支到测试环境进行测试;
4、开发将测试通过的feature分支合并到uat分支,运维打包发布uat分支至uat环境,客户在uat分支进行测试;
5、在确认发布生产时,开发leader从master分支拉取出release分支用于发布;
6、开发将uat测试通过的feature分支合并到release分支中,运维打包发布release分支至生产环境;
7、在观察生产环境没有问题之后,开发leader将release分支合并到master分支;
简述热修复流程:
1、如果发现生产版本有bug需要紧急修复,开发从master分支拉取出hotfix分支;
2、开发在hotfix分支中进行bug修改,修复后合并至dev分支进行测试,测试通过后,用hotfix分支进行生产版本发布,并将hotfix分支合并至uat、master分支中;

二、具体操作流程

1、(开发或者开发leader操作)开发从master分支拉取出feature分支

这里有两种方式,一种是在GitLab上进行拉取,一种是在IDEA中进行拉取

1.1、在GitLab上如何新建远程分支

首先登录GitLab,然后选择对应的项目

gitlab15文档 gitlab做文档管理_git_02

gitlab15文档 gitlab做文档管理_github_03

gitlab15文档 gitlab做文档管理_github_04

1.2、在IDEA里创建新的远程分支

在IDEA右下角选择打开Git的Branches,然后选择远程分支中的master分支,再选择New Branch from Selected…

gitlab15文档 gitlab做文档管理_gitlab15文档_05


在弹窗中填写分支的名称,并点击Checkout

gitlab15文档 gitlab做文档管理_运维_06


注意,此时只是创建了本地的分支,远程分支中还不存在该分支

gitlab15文档 gitlab做文档管理_运维_07


下面选择这个本地分支,进行push

gitlab15文档 gitlab做文档管理_gitlab15文档_08


在弹窗中选择push,将本地分支推送到远程,相当于创建了远程分支

gitlab15文档 gitlab做文档管理_github_09

这时候远程分支里就多出了这个新的分支

gitlab15文档 gitlab做文档管理_git_10

1.3、如果远程分支是在GitLab上创建,或者由别的开发创建的,那么该如何获取这个远程分支并将其拉取到本地呢

如果分支是在GitLab上创建,或者由别的开发创建,我们在IDEA的Branches中找不到,该怎么办,按照下图中的操作,选择Fetch或者右上角的更新都可以

gitlab15文档 gitlab做文档管理_运维_11

如何将远程分支拉取到本地呢,在IDEA的Branches中选择远程分支,点击Checkout

gitlab15文档 gitlab做文档管理_运维_12


可以看到将远程分支拉取到了本地,并自动切换到了这个分支上

gitlab15文档 gitlab做文档管理_github_13

2、(开发操作)开发在feature分支上做需求开发或bug修复

开发在本地的feature分支上进行开发或者bug修复,之后进行commit和push,这里要注意,commit只是提交到本地分支上,push才会将本地的变动推送到远程分支,具体操作如下,在Local Changes里选中需要提交的文件,右击选择Commit File…

gitlab15文档 gitlab做文档管理_github_14

填写备注信息,选择Commit或者Commit and Push…,根据自己的需要,如果只是commit,之后要记得一起push

gitlab15文档 gitlab做文档管理_运维_15

3、(开发操作)开发将feature分支合并到dev分支,测试打包发布dev分支到测试环境进行测试;

3.1、前提是feature中的代码已经push到了远程分支,先将远程dev分支,Checkout到本地来,如果已经存在本地的dev分支了,那么就切换到本地dev分支,并更新最新的代码

3.2、确保IDEA中现在的分支是dev分支(目标分支),然后选择feature分支(源分支),选择Merge into Current

gitlab15文档 gitlab做文档管理_运维_16

3.3、执行完上述操作后,相当于将feature分支上的改动在dev本地分支上Commit了,下面要做的就是将dev本地分支push到远程分支上

gitlab15文档 gitlab做文档管理_git_17

4、(开发操作)开发将测试通过的feature分支合并到uat分支,运维打包发布uat分支至uat环境,客户在uat分支进行测试;

参考第3步

5、(开发leader操作)在确认发布生产时,开发leader从master分支拉取出release分支用于发布;

参考第1步

6、(开发操作)开发将uat测试通过的feature分支合并到release分支中,运维打包发布release分支至生产环境;

参考第3步

7、(开发leader操作)在观察生产环境没有问题之后,开发leader将release分支合并到master分支;

参考第3步

三、特殊场景如何处理

1、如果开发在第4步的时候发现,feature分支中有部分功能没有通过测试,不可以上线到uat,但其他通过的功能需要上线到uat,怎么办

首先,把本地分支切换到目标分支上(这里代表uat分支);

然后在IDEA的log操作栏中选择源分支(这里代表feature分支),右击选择Cherry-Pick,这样就会将这个log中commit的代码,拉取到本地uat分支,并commit;

gitlab15文档 gitlab做文档管理_运维_18

gitlab15文档 gitlab做文档管理_远程分支_19

然后将本地uat分支push到远程uat分支;

2、本地分支,如果commit错了,想回滚怎么办

在log操作栏中右击想要回退的commit日志,选择Revert Commit或者Undo Commit,Revert Commit是会再生成一条相反的提交,Undo Commit是将提交回退到未提交状态,Undo Commit只能针对最后一条日志

gitlab15文档 gitlab做文档管理_运维_20

3、远程分支,如果想要回退到历史的版本,怎么操作

在log操作栏中选择想要回退的commit日志,右击选择Reset Current Branch to Here…

gitlab15文档 gitlab做文档管理_gitlab15文档_21

在弹窗中选择Hard,点击Reset

gitlab15文档 gitlab做文档管理_gitlab15文档_22


然后push本地分支,选择Force Push

gitlab15文档 gitlab做文档管理_git_23

注意:Force Push需要慎用,如果你在其他人推送更改之前进行Force push,会覆盖他们的更改。这可能会导致合并冲突和数据丢失

四、Merge和Rebase如何选择

1、下游分支更新上游分支内容的时候使用Rebase

比如我从master上拉取了一个feature分支,一段时候过后,master分支上有代码改动,feature分支上也有代码改动,而这时候,我需要把master的变更拉取到feature分支上,就需要用Rebase,具体操作如下

  • 将IDEA的当前分支切换成feature分支;
  • 在Branches中选择master分支,再选择Rebase Current onto Selected;
  • 最后再push;

gitlab15文档 gitlab做文档管理_远程分支_24

2、上游分支合并下游分支内容的时候使用Merge

这个没什么好说的,feature分支往dev、uat、release分支合并时,选择Merge

3、更新当前分支的内容时一定要使用Rebase

比如,现在有个feature分支,有两个开发同时在这个分支上开发,A开发拉取了最新的代码,并开始修改代码了,这时候B开发已经完成自己的开发并且Commit和Push了,这时候分两种情况:

1、A开发需要依赖B开发的代码,他需要更新分支,这时候需要选择Rebase,参考如下步骤

gitlab15文档 gitlab做文档管理_gitlab15文档_25

这个默认选中Rebase可以在Setting中设置,具体看下图

gitlab15文档 gitlab做文档管理_运维_26


2、A开发并不知道B开发已经push了代码,A开发push代码时,也会弹出窗口让选择Merge还是Rebase,也需要选择Rebase,如下图

gitlab15文档 gitlab做文档管理_github_27