Android studio使用git代码管理

648 阅读11分钟

「这是我参与2022首次更文挑战的第4天,活动详情查看:2022首次更文挑战

前言

git和gitLab在我们日常使用时很关键,我们来看一下如何使用。

正文

我们从最简单的一步一步说起。

创建Group

作为一个项目负责人,需要创建对应的组,这里通常是一个开发组,在设置里面:

image.png

比如这里创建完一个叫做Android的分组,点击Android分组可以给组添加成员,以及成员的角色:

image.png

比如这里就添加了honglu到项目组成员里。

这里有一点需要注意就是这里的角色:

image.png

具体角色权限如下:

image.png

然后可以查看组员,修改其权限,以及删除组员,查看如下:

image.png

这里只有zhangyuanhaoOwner,其他人全是Developer,关于这个是否提高其角色,我们后面再分析。

创建项目

创建完小组后,就可以创建该组的项目了,我这里还是以Android组为例,创建一个Android项目:

image.png

然后如下:

image.png

这里一般就是创建一个空项目:

image.png

然后这里这里我标记了4点,挨个说一下:

  • 项目名,这个最好起简单易懂的名字。

  • 项目位置,这里可以选我们刚才创建的组,也可以选择是个人项目。

  • 权限,假如是组的话,默认组里所有人都可见,对于项目的权限在前面权限里说过。

  • README可以不要,具体项目自己上传。

然后点击创建项目:

image.png

这个项目即创建完成,但是它没有内容,这时我们最常见的情况就是我把本地的项目上传到这个分支中。

在说这个之前,还是说2种git常用的工作模式流。

git工作流

首先git分为远程仓库和本地仓库,示意图如下:

image.png

比如我们上面创建的项目就是在远程。

集中式工作流

什么叫做集中式呢,示意图如下:

image.png

这个master就是远程的一个分支,然后开发者A B C直接从master上拉取代码到A B C的本地仓库,然后进行修改,再commit到各自的本地仓库,假如A要push代码时,必须先拉取远程分支,这时如果有冲突,合并冲突,并commit到本地仓库,冲突解决完,且可以正常运行后,再push到远程master,这时A就工作完成;开发者B开发完一个功能想push代码时,也需要做一样的操作。

这种模式很像SVN,也非常简单,提交时发现有冲突就解决,解决完再提交。

标准项目管理工作流

这种就是很多大公司的做法,比较正规,同时适合项目管理,示意图如下:

image.png

上面各个分支的作用如下:

  • 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分支可以多加几个,比如dev1dev2分支,给开发组组员使用,PR/PM后不用删除,feature分支用来添加一个特殊的小功能,和devN分支类似,但是它加完就不要了,在PR/PR后可以删除。

上传已有项目

在上面说完git流后,我们先以集中式工作流来看,假如我作为开发者或者项目维护者,我想把本地刚刚创建的一个项目给上传到远程,这是最常见的情况。

比如我创建了一个项目:

image.png

然后点击AS下面的Terminal打开命令行:

image.png

这里需要使用git指令来快速完成,使用什么指令呢 找到之前gitlab中创建项目,会有下面内容:

image.png

这里我们逐步来说一下:

//配置名字,后面提交代码记录就是这个名字
git config --global user.name "zhangyuanhao"
//这个邮箱就是你注册gitlab的邮箱
git config --global user.email "2414504641@qq.com"

image.png

然后我想push已经存在的目录文件,

//初始化一个git仓库,这时就会有一个.git文件了
git init 

image.png

接着添加一个远程仓库

//添加远程仓库,添加一个远程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个命令后:

image.png

这里就完成了第一步了,对于这里有个-u,这里第一次如果加了,后面就可以直接git push来简化上面这个指令了,这时我们来看看gitlab中的情况:

image.png

已经成功提交到了Gitlab上。

集中式工作流开发阶段

添加dev分支

好了,现在我们来说一下集中式工作流开发阶段,前面说了这种方式很像SVN,这后面就可以使用AS来进行了,首先看一下分支,点击AS的右下角:

image.png

会发现有一个远程分支叫做master,有一个本地分支master,然而前面也说过,这个master分支是主分支,用来发版本的,所以需要创建一个dev分支:

image.png

然后会发现本地就多了一个分支:

image.png

可以把这个分支提交到远程去,注意分支名前面是个笔就说明当前AS代码在哪个分支上,所以直接使用AS进行push:

image.png

push完之后会发现:

image.png

远程2个分支,本地2个分支,正常情况。

组长设置权限

既然有了2个分支,前面也说了master分支只有组长有权限来合并发布版本,而dev分支是给各个组员进行开发的,所以再打开gitLab,点击如下:

image.png

然后给dev配置个权限如下:

image.png

这时就可以看到master分支只有维护者(一般是组长)可以merge和push,而dev开发者就可以merge和push,再看一下这个项目的成员:

image.png

这里会发现只有1个是Owner,3个Developer,然后配置好权限后,就可以开发了。

AS下载、提交代码

记住上面的组员,这时zhangyuanhao即Owner想开发这个项目,直接从这里赋值https链接:

image.png

然后打开AS:

image.png

直接输入复制的https链接,然后下载完打开项目,查看git信息:

image.png

会发现这里默认是master分支,我想开发,肯定不能使用master分支,直接切换:

image.png

image.png

这时就会发现AS当前工作区已经切换到了dev分支上,然后更新一下仓库的代码:

image.png

假如这里有冲突,就会提醒,冲突解决,后面再说。

然后我修改提交代码如下,很简单,就是那3个箭头,先更新,没问题再commit:

image.png

然后再push:

image.png

这样就完成了一个push到远程的工作了。

我们在gitLab上看一下:

image.png

ok,zhangyuanhao开发者已经开发好了,并且push到了远程仓库。

其他人开发

这时组员honglu作为Developer需要开发这个项目,使用上面的https链接进行下载,前面说了默认分支AS会是第一个master,假如honglu没有注意,在这上面改了代码:

7bdd3c6e4411205cf99cc6471b00082.png

d050715082cd63196a021e846d3f878.png

然后进行commit和push:

d050715082cd63196a021e846d3f878.png

1885c07f98f4db848a45e2f4a841bb1.png

会提示当前push被拒绝,这是正常的,因为权限问题,然后切换分支:

db2e1fa9f09d54303ffad9ed248e7bd.png

再进行提交:

06841dc7978ba85b56b35dacbaa4403.png

就可以提交成功了。

冲突解决

这时zhangyuanhao也正在改同一个文件:

image.png

改完后我想提交代码,于是更新代码,就会出现冲突:

image.png

这里使用AS的冲突解决工具和SVN一样,按需合并代码即可:

image.png

合并完之后便可以commit、push了,就不说了。

这种模式就和SVN一模一样没啥好说的。

checkOut注意点

前面说了,假如我刚开发了代码,发现分支没切换,然后我又checkout到新分支,会发现代码没了,那咋办,就可以把刚刚的分支合并到这个分支。

比如我在dev分支下:

image.png

切换到master分支:

image.png

然后点击git -> merge :

image.png

image.png

这里就提示把本地的dev分支merge到本地的master分支,点击MERGE即可完成MERGE,假如有冲突,自己解决,然后再把本地master进行push(这是zhangyuanhao Onwer有权限),会发现:

image.png

dev中的所有提交记录都会提交到master中。

标准式工作流

前面说的工作流方式和SVN一样,我们在git中不推荐,现在使用常用的情况,所以还是先配置。

组长进行配置

首先还是组长进行分支拉取和权限分配:

image.png

从dev分支拉出honglu_dev分支:

image.png

然后和zhangyuanhao_dev分支:

image.png

然后老地方进行权限分配:

image.png

然后这里把dev设置为仅仅维护者才有权限merge和push,其他个人开发分支Developer可以merge和push。

组员在特定dev分支开发

这是zhangyuanhao在他自己dev分支进行开发和提交代码:

image.png

image.png

然后到gitLab上把这个功能代码进行合并到dev上:

image.png

image.png

这里zhangyuanhao_dev的代码合并到dev上:

image.png

然后这时开发者就可以告诉组长,他需要review代码和合并代码了。

组长进行review和合并

这时开发组长就会收到merge request请求,可以进行review和合并,假如代码写的有问题,可以打回这个MR,如下:

image.png

然后这样便可以完成merge了:

image.png

其他组员进行开发

这时hognlu也进行开发,所以他切换到honglu_dev进行开发,然后开发完功能commit、push到远程的honglu_dev分支上,这时需要把远程honglu_dev分支的功能合并到远程dev分支上,按上面说honglu可以直接提交merge request,但是千万不可以,这时honglu需要先合并代码,即把远程dev的功能合并到本地honglu_dev上:

2b82457fa496f8fb8b8770463a2171f.png

09dcb9415836fb12dd3de62beb51581.png

这时由于其他组员已经改了代码,所以这里就会有冲突,需要自己解决:

09dcb9415836fb12dd3de62beb51581.png

在合并完代码后,需要自己运行一下,看看程序是否正常,正常后再进行push到远程honglu_dev:

2887fee3431b115c5a555a16563e37e.png

干完这些,honglu就可以在gitlab上提交merge request了:

fcd615b09f30d0fe4a9bfadf83ee99b.png

1d38fdf2523c3ad4092e029ea2e8f3c.png

这里是honglu_dev申请合并到dev,然后填写review代码的人和需要加签的人,即可创建一个MR:

f5d26c12a39d4fa2d8e7ac55eb695a4.png

fcd615b09f30d0fe4a9bfadf83ee99b.png

组长进行合并组员的MR

然后组长便可以登录gitlab,进行查看MR:

3b88ed986b60691ec9f5579b9e32393.png

可以查看commit信息以及review代码:

6a2cd618da922ed24324b6d154b6e46.png

确保无误后,进行merge即可:

a0b01b1c1f485e415949a4a9916eb52.png

到这里整个多人协作开发标准流程即完成。

我们在AS中打开log,可以查看所有的记录,比如我在AS中切换到dev分支,查看log:

image.png

这里就可以清晰地看出什么时候合并以及哪些人改了东西。

git忽略文件

其实在AS创建项目时,就会默认有.gitignore文件,假如它不说很全面地话,可以去gitHub上看对应项目的,地址是:

gitignore

总结

这里只是一个扫盲教程,包含了一些基本操作,没啥特别说的,就一点,组员提Merge Request前一定要把远程dev合并到个人dev上再提,不然开发组长天天就合并代码去了,对于一些git使用的难点问题,在后面文章继续分析。