「这是我参与2022首次更文挑战的第4天,活动详情查看:2022首次更文挑战」
前言
git和gitLab在我们日常使用时很关键,我们来看一下如何使用。
正文
我们从最简单的一步一步说起。
创建Group
作为一个项目负责人,需要创建对应的组,这里通常是一个开发组,在设置里面:
比如这里创建完一个叫做Android的分组,点击Android分组可以给组添加成员,以及成员的角色:
比如这里就添加了honglu到项目组成员里。
这里有一点需要注意就是这里的角色:
具体角色权限如下:
然后可以查看组员,修改其权限,以及删除组员,查看如下:
这里只有zhangyuanhao是Owner,其他人全是Developer,关于这个是否提高其角色,我们后面再分析。
创建项目
创建完小组后,就可以创建该组的项目了,我这里还是以Android组为例,创建一个Android项目:
然后如下:
这里一般就是创建一个空项目:
然后这里这里我标记了4点,挨个说一下:
-
项目名,这个最好起简单易懂的名字。
-
项目位置,这里可以选我们刚才创建的组,也可以选择是个人项目。
-
权限,假如是组的话,默认组里所有人都可见,对于项目的权限在前面权限里说过。
-
README可以不要,具体项目自己上传。
然后点击创建项目:
这个项目即创建完成,但是它没有内容,这时我们最常见的情况就是我把本地的项目上传到这个分支中。
在说这个之前,还是说2种git常用的工作模式流。
git工作流
首先git分为远程仓库和本地仓库,示意图如下:
比如我们上面创建的项目就是在远程。
集中式工作流
什么叫做集中式呢,示意图如下:
这个master就是远程的一个分支,然后开发者A B C直接从master上拉取代码到A B C的本地仓库,然后进行修改,再commit到各自的本地仓库,假如A要push代码时,必须先拉取远程分支,这时如果有冲突,合并冲突,并commit到本地仓库,冲突解决完,且可以正常运行后,再push到远程master,这时A就工作完成;开发者B开发完一个功能想push代码时,也需要做一样的操作。
这种模式很像SVN,也非常简单,提交时发现有冲突就解决,解决完再提交。
标准项目管理工作流
这种就是很多大公司的做法,比较正规,同时适合项目管理,示意图如下:
上面各个分支的作用如下:
-
master:主分支,这个不用说了,用于记录版本或者tag记录。 -
dev:开发分支,这个也就是完整代码的分支,用于追踪所有项目组开发者的开发代码。 -
feature: 新功能开发分支,从dev拉取,比如APP要加个新功能XX,由开发者A开发,当A开发完后,可以提交PR/MR到dev分支,dev分支合并了该代码后,dev代码就有了XX功能。 -
hotfix:热修复分支,当master分支出现了bug,即线上出现了bug,这时立马拉出一个热修复分支,当热修复分支中把bug解决后,需要合并到dev分支和master分支,合并到master分支可以打个小版本发布,合并到dev分支是为了让后续开发没有这个bug了。 -
release:发布分支,这个分支就可以在发布新版本前拉取一个,然后改一些版本号啥的,改完后合入master和dev,在master上打tag发布新版本。
上面每个分支都有意义,但是以我的个人建议来看,release分支可以不要,dev分支可以多加几个,比如dev1、dev2分支,给开发组组员使用,PR/PM后不用删除,feature分支用来添加一个特殊的小功能,和devN分支类似,但是它加完就不要了,在PR/PR后可以删除。
上传已有项目
在上面说完git流后,我们先以集中式工作流来看,假如我作为开发者或者项目维护者,我想把本地刚刚创建的一个项目给上传到远程,这是最常见的情况。
比如我创建了一个项目:
然后点击AS下面的Terminal打开命令行:
这里需要使用git指令来快速完成,使用什么指令呢 找到之前gitlab中创建项目,会有下面内容:
这里我们逐步来说一下:
//配置名字,后面提交代码记录就是这个名字
git config --global user.name "zhangyuanhao"
//这个邮箱就是你注册gitlab的邮箱
git config --global user.email "2414504641@qq.com"
然后我想push已经存在的目录文件,
//初始化一个git仓库,这时就会有一个.git文件了
git init
接着添加一个远程仓库
//添加远程仓库,添加一个远程origin仓库,git remote是操作远程
git remote add origin https://gitlab.wayealsoft3.top/android/testdemo.git
然后便可以添加文件、提交文件和push文件了,分别如下:
//添加当前所有文件到本地缓冲区
git add .
//commit到本地仓库
git commit -m "Initial commit"
//push到自己创建的远程仓库以及哪个分支上
git push -u origin master
这里或许有个疑问,我前面只创建了一个远程仓库叫做origin,可并没有创建分支呢,原因是会有个默认分支叫做master,执行完上面4个命令后:
这里就完成了第一步了,对于这里有个-u,这里第一次如果加了,后面就可以直接git push来简化上面这个指令了,这时我们来看看gitlab中的情况:
已经成功提交到了Gitlab上。
集中式工作流开发阶段
添加dev分支
好了,现在我们来说一下集中式工作流开发阶段,前面说了这种方式很像SVN,这后面就可以使用AS来进行了,首先看一下分支,点击AS的右下角:
会发现有一个远程分支叫做master,有一个本地分支master,然而前面也说过,这个master分支是主分支,用来发版本的,所以需要创建一个dev分支:
然后会发现本地就多了一个分支:
可以把这个分支提交到远程去,注意分支名前面是个笔就说明当前AS代码在哪个分支上,所以直接使用AS进行push:
push完之后会发现:
远程2个分支,本地2个分支,正常情况。
组长设置权限
既然有了2个分支,前面也说了master分支只有组长有权限来合并发布版本,而dev分支是给各个组员进行开发的,所以再打开gitLab,点击如下:
然后给dev配置个权限如下:
这时就可以看到master分支只有维护者(一般是组长)可以merge和push,而dev开发者就可以merge和push,再看一下这个项目的成员:
这里会发现只有1个是Owner,3个Developer,然后配置好权限后,就可以开发了。
AS下载、提交代码
记住上面的组员,这时zhangyuanhao即Owner想开发这个项目,直接从这里赋值https链接:
然后打开AS:
直接输入复制的https链接,然后下载完打开项目,查看git信息:
会发现这里默认是master分支,我想开发,肯定不能使用master分支,直接切换:
这时就会发现AS当前工作区已经切换到了dev分支上,然后更新一下仓库的代码:
假如这里有冲突,就会提醒,冲突解决,后面再说。
然后我修改提交代码如下,很简单,就是那3个箭头,先更新,没问题再commit:
然后再push:
这样就完成了一个push到远程的工作了。
我们在gitLab上看一下:
ok,zhangyuanhao开发者已经开发好了,并且push到了远程仓库。
其他人开发
这时组员honglu作为Developer需要开发这个项目,使用上面的https链接进行下载,前面说了默认分支AS会是第一个master,假如honglu没有注意,在这上面改了代码:
然后进行commit和push:
会提示当前push被拒绝,这是正常的,因为权限问题,然后切换分支:
再进行提交:
就可以提交成功了。
冲突解决
这时zhangyuanhao也正在改同一个文件:
改完后我想提交代码,于是更新代码,就会出现冲突:
这里使用AS的冲突解决工具和SVN一样,按需合并代码即可:
合并完之后便可以commit、push了,就不说了。
这种模式就和SVN一模一样没啥好说的。
checkOut注意点
前面说了,假如我刚开发了代码,发现分支没切换,然后我又checkout到新分支,会发现代码没了,那咋办,就可以把刚刚的分支合并到这个分支。
比如我在dev分支下:
切换到master分支:
然后点击git -> merge :
这里就提示把本地的dev分支merge到本地的master分支,点击MERGE即可完成MERGE,假如有冲突,自己解决,然后再把本地master进行push(这是zhangyuanhao Onwer有权限),会发现:
dev中的所有提交记录都会提交到master中。
标准式工作流
前面说的工作流方式和SVN一样,我们在git中不推荐,现在使用常用的情况,所以还是先配置。
组长进行配置
首先还是组长进行分支拉取和权限分配:
从dev分支拉出honglu_dev分支:
然后和zhangyuanhao_dev分支:
然后老地方进行权限分配:
然后这里把dev设置为仅仅维护者才有权限merge和push,其他个人开发分支Developer可以merge和push。
组员在特定dev分支开发
这是zhangyuanhao在他自己dev分支进行开发和提交代码:
然后到gitLab上把这个功能代码进行合并到dev上:
这里zhangyuanhao_dev的代码合并到dev上:
然后这时开发者就可以告诉组长,他需要review代码和合并代码了。
组长进行review和合并
这时开发组长就会收到merge request请求,可以进行review和合并,假如代码写的有问题,可以打回这个MR,如下:
然后这样便可以完成merge了:
其他组员进行开发
这时hognlu也进行开发,所以他切换到honglu_dev进行开发,然后开发完功能commit、push到远程的honglu_dev分支上,这时需要把远程honglu_dev分支的功能合并到远程dev分支上,按上面说honglu可以直接提交merge request,但是千万不可以,这时honglu需要先合并代码,即把远程dev的功能合并到本地honglu_dev上:
这时由于其他组员已经改了代码,所以这里就会有冲突,需要自己解决:
在合并完代码后,需要自己运行一下,看看程序是否正常,正常后再进行push到远程honglu_dev:
干完这些,honglu就可以在gitlab上提交merge request了:
这里是honglu_dev申请合并到dev,然后填写review代码的人和需要加签的人,即可创建一个MR:
组长进行合并组员的MR
然后组长便可以登录gitlab,进行查看MR:
可以查看commit信息以及review代码:
确保无误后,进行merge即可:
到这里整个多人协作开发标准流程即完成。
我们在AS中打开log,可以查看所有的记录,比如我在AS中切换到dev分支,查看log:
这里就可以清晰地看出什么时候合并以及哪些人改了东西。
git忽略文件
其实在AS创建项目时,就会默认有.gitignore文件,假如它不说很全面地话,可以去gitHub上看对应项目的,地址是:
总结
这里只是一个扫盲教程,包含了一些基本操作,没啥特别说的,就一点,组员提Merge Request前一定要把远程dev合并到个人dev上再提,不然开发组长天天就合并代码去了,对于一些git使用的难点问题,在后面文章继续分析。