理解Git!实习老板要我用Git协作
在公司实习,老板:你git新建一个分支,先让测试的同学测试完你写的内容,再合并到master里去。
我:???
实习工作的时候,公司的项目代码往往多人协同合作,需要用到Git工具,把代码提交到Gitlab上去, 虽然之前学习过Git的简单使用,但当昨天老板突然这么一句,我就懵逼了,分支是干啥的?
之前都是在GitHub上建立一个项目,只有master分支,从来没有遇到过这种多人协作的场景,也从没接触过Git创建分支等操作,但在上级面前,又不好意思都说这些东西没接触过(我发现实习时,要用的工具是默认大家都会的),应了一声,就赶紧偷摸学了一波。
这里主要整理多人协作时常用的git操作,当然,也有pycharm的Git使用,毕竟这东西比命令可是香太多啦。
1. Git最常用的几个操作
关于git是啥,怎么安装啥的,这里就不说了,网上资料一大堆,这里先整理我个人如果用的话,往往常用的几个操作。
首先,下载Git,完成一些基本的配置:
# github或者gitlab用到的用户名和邮箱
$ git config --global user.name "John Doe"
$ git config --global user.email "[email protected]"
# 查看基本配置
git config --list
然后,配置ssh提交
# 生成秘钥
ssh-keygen -t rsa -C "[email protected]" # ~/.ssh目录下面会有id_rsa和id_rsa.pub两个文件
cat id_rsa.pub # 把这个里面的内容复制
复制上面的内容之后,打开你的github,进入配置页:Settings – SSH and GPG keys,添加本地生成的ssh秘钥,选择New SSH key(这里已经配置了一个key,如果是未配置秘钥的用户,这里是空的),把复制的内容贴过来,然后保存:
#测试是否配置成功
用ssh链接git:ssh -T [email protected]
这样做的原因是后面提交代码的时候,用的是ssh服务,还可以用http服务,不过那个还得每次git push的时候,得输入GitHub用户名和密码登陆太麻烦,而走ssh这个,就可以直接提交。这样,Git的基本配置就完成了。
# 克隆项目下来
git clone [email protected]:zhongqiangwu960812/AI-RecommenderSystem.git
# 如果新改了某个文件,需要同步到远程
# 如果是新增了某个文件,可以直接
git add 文件名
git status # 可以查看修改情况
git commit -m '新加文件' # 提交说明
git push # 提交
# 这样,就搞定了
# 如果是删除了某个或者修改了很多地方等,可以
git add .
git commit -m 'update many'
git push
# 如果是从远程仓库改了文件,需要先拉到本地,让本地和远程保持一致之后再push
git pull
这些命令,就是在学校里面自学的命令了,当时我记得也看到过分支啥的,但由于场景有限,不知道怎么运用,所以就难理解,而在公司,竟然这些才是最基础操作。下面是昨天刚学习的一些东西:
2. git 分支
关于分支是啥什么时候用?场景至关重要,这里只说针对我现在的处境的一个理解。目前公司在Gitlab上,我们组共同维护着一个大项目, 每个人都可以对这个项目根据需求进行修改。而我实习之后,拿到的第一个任务,就是迁移接口和队列的操作,需要改一些配置啥的,这时候我git clone下这个项目来之后,用pycharm打开,然后进行修改。
我按照需求和老板指示,修改完了第一版代码,然后打算去提测(就是开发完成,去找测试的同学测试),这时候,由于我的代码没有经过测试,根本不知道能不能运行成功。而测试的同学拿我代码,只能通过gitlab去拿,然后可以code diff,顺便测试等。一时间,我既不能把代码直接提交到master上,因为master是维护最终正确代码的;而我又必须得提交到gitlab。于是乎,老板说,你建立个分支就行了,把你代码提交到分支上,测试的同学测试成功之后,再merge到master上就解决了。
所以有了场景之后,有些东西自然会有感觉,分支现在给我的感觉,仿佛是面临多个需求,需要修改代码的时候,或者多个人共同维护一个项目,但是又不能直接往master提交的时候,分支是作为了每个人进行代码缓冲的地方。
我建立分支之后,就可以在这个分支下按照需求进行修改,这样还不影响最终代码,当有好几个版本,或者有好几个需求的时候,就非常适合建立分支,一个分支对应一个需求,开发完毕,进行push到分支,接着从另一个分支上开发,这样互不影响,最后还可以merge起来。
如何建立分支呢?
# 分支的创建与切换, 也可以直接用一行代码:git brance -b 分支名
git branch 分支名
git checkout 分支名
# 修改完了代码,需要push到远程分支上,可以下面操作
git push --set-upstream origin 分支名
# 查看分支
git branch # 本地分支
git branch -r # 远程分支
git brance -a # 查看所有分支
上面这些命令估计看了就头大,没关系,下面还有种非常简单的傻瓜式操作,就是pycharm的Git。
3. Pycharm的git
关于这个东西,也是不介绍,直接说是咋用的。我是先把gitlab上的项目git clone到本地。然后pycharm打开,此时:
左下角这里,会有目前所在的分支,默认的时候是master分支,由于我这里修改了三版代码,所以新建了三个分支。如果面临新需求,可以点击上面的New Brance新建立分支,默认会自动切换到此分支,这时候,就可以肆无忌惮的写代码了。
此时,如果我们修改代码,pycharm会自动标记出来,修改是蓝色,Add之后变成绿色好像是,修改完代码,我们右键点击项目名称,在里面有个git选项,在这里吗就能够看到add和commit的操作了,我们可以先Add,把修改的代码放到暂存区,然后进行commit的操作。
点击commit director之后,就会看到这样的一个界面:
上面的窗口就会看到自己修改的东西,而下面,可以添加修改描述,接下来可以直接commit and push,也可以直接commit, 如果是前者,就会自动同步到远程的对应分支上去,如果是后者,还需要push操作才会同步到远程上去。
所以这个就非常方便了,我今天用的时候,是根据其中一个需求,建立了分支v1,然后修改代码,进行提测,提测的时候测试小姐姐让我提供分支名和commit id(ci id),我对后面这个又一脸懵逼,这个commit id是这么查的, 命令行输入:
git log
这里面会显示自己的历史提交:
最近的一次,commit后面那一长串就是commit id了。
知道了这个之后,又面临一个需求,所以又建立的了个v2分支,把代码开发提交测试,接着新建立一个V3分支,在V2的基础上继续修改代码,此时测试小姐姐说v2上的代码有问题,需要修改,此时我面临的处境在v3分支上新加了新代码。当我切换到v2的时候,发现,呀,这不和v3是一样的了吗?这我还咋改v2。然后老板和我说,你v3改了之后要commit才行呀,这时候,才能看到真正的v2。所以在v3分支上,把修改先commit,此时再切回v2,看到了原来的v2,再从这个基础上改代码,push到v2分支,再提测就OK了。
然后又从v3的基础上,把新的需求改完,add+commit push即可把之前的commit的,和后又新加的都一块同步到远程仓库,确实非常方便。
有分支就有合并。当然,还有merge的需求,场景是这样子的:
上面我接了2个开发任务,新建了一个v2分支,去做A需求,这个开发完成之后, 需要进行提测和上线, 在我提测了之后,接着又在v2的基础上,建立了一个新的分支v3做B需求, 这时候, v2测试过了,然后需要上线,所以就merge到了master,然后部署上线。 这时候远程v2分支就没了(merge了嘛)。
接着,我从v3上做新的开发,做完了之后,本来想提测,这时候发现了个问题,v3是v2merge,上线之前建立出来的,而v2在merge和上线之前,根据测试那边的反馈是做了些改动的,这时候,就面临着,即使我v3完成了当前的B需求,但A需求v3这个版本是没有管的,也就是即使提测,相当于能满足B需求而A需求又没法满足了,怎么办呢?这时就用到了merge。这里老板告诉我的解决办法:把远程的master(这个是最新的)pull到你本地的master分支,然后把本地的master合并到v3就可以了,再把v3push到远程的v3分支。
所以,merge的意思是什么呢?是保留最新的改动,如果把master merge到v3上,由于master是满足了A需求的,merge到v3后,我v3就不需要再管master的各种修改了,统一到了最新的版本上去,基于新的master进行了再开发, 这个是真的学到了。如果感觉说的比较抽象,可以先看看廖雪峰的Git教程,先了解下从dev合并到master分支是啥意思。而我master分支合并到dev上,其实相当于这个意思:
通过这一天,我算是见识了,之前从没有体会到Git原来是这么玩的。像上面这个分支, 之前怎么看都感觉不理解,结果真正用的时候, 一晚上就有感觉了,所以学习知识,真的要想办法学以致用 😉