1.简介
1.1 关于版别操控
版别操控是一种记载一个或若干文件内容改变,以便将来查阅特定版别修订情况的体系。
1.2 版别操控发展史
1.2.1 本地版别操控
记载文件每次的更新,能够对每个版别做一个快照,或是记载补丁文件,合适个人用,如RCS。
1.2.2 集中式的版别操控
一切的版别数据都保存在服务器上,协同开发者从服务器上同步更新或上传自己的批改
一切的版别数据都存在服务器上,用户的本地只要自己以前所同步的版别,假设不连网的话,用户就看不到前史版别,也无法切换版别验证问题,或在不同分支作业。而且,一切数据都保存在单一的服务器上,有很大的危险这个服务器会损坏,这样就会丢失一切的数据,当然能够定时备份。代表产品:SVN、CVS、VSS
1.2.3 分布式版别操控体系
一切版别信息库房全部同步到本地的每个用户,这样就能够在本地检查一切版别前史,能够离线在本地提交,只需在连网时push到相应的服务器或其他用户那里。由于每个用户那里保存的都是一切的版别数据,只要有一个用户的设备没有问题就能够恢复一切的数据,但这添加了本地存储空间的占用。
1.3 什么是git
Git是现在世界上最先进的分布式版别操控体系。
优点:
- 合适分布式开发,着重个别。
- 公共服务器压力和数据量都不会太大。
- 速度快、灵敏。
- 任意两个开发者之间能够很容易的处理抵触。
- 离线作业 缺陷:
- 形式上比SVN更加复杂。
- 不符合常规思维。
- 代码保密性差,一旦开发者把整个库克隆下来就能够完全揭露一切代码和版别信息。
2.本地操作
2.1 装置git
2.1.1 window装置
在官网下载装置文件,双击打开,然后一向“NEXT”就好。 下载地址如下:git-scm.com/download/wi…
2.2 初始化一个本地库房
咱们现在要初始化一个本地库房:
git init
创立之后,目录下会多一个”.git”的文件夹,这个项目git的配置都在这个文件夹下面。留意:假设这个.git文件没有显示出来,需求咱们把隐藏文件设置显示出来即可,一般咱们不需求批改此文件夹下的内容。
2.3 新增批改文件而且提交到git
先新建一个文件,在进到改文件打开 git Bash Here 接着履行如下
git add . // 更新到暂存区
git commit -m "build: 初始化项目" // 更新到资源库
履行后出现了个错误:
这儿是说咱们得告知git咱们是谁,所以履行一下下面的指令
git config --global user.email "xiaoyuzhou@example.com"
git config --global user.name "xiaoyuzhou"
再次履行 commit 指令
git commit -m "build: 初始化项目"
这样文件就提交上去了。
这儿简略阐明一下:
Git本地有三个作业区域:作业目录(Working Directory)、暂存区(Stage/Index)、资源库(Repository或Git Directory)。
- Workspace:作业区,便是你平常寄存项目代码的当地
- Index / Stage:暂存区,用于暂时寄存你的改动,事实上它只是一个文件,保存即将提交到文件列表信息
- Repository:库房区(或本地库房),便是安全寄存数据的方位,这儿边有你提交到一切版别的数据。其间HEAD指向最新放入库房的版别
总结:
- 咱们运用 git add 作业区的文件添加到暂存区。
- 运用 git commit -m “xxxx” 将暂存取的内容推到库房。里边的内容信息能够参照 “Conventional Commits” 书写规矩。
- 书写良好的 commit message loveky.github.io/2018/06/04/…
2.4 检查前史纪录和状况
咱们能够运用 git status 检查状况, 运用 git log 检查前史纪录。
咱们来看下面的栗子
咱们先建立三个文件
第一步
vi a.txt // 新增 a.txt 文件
git add .
git commit -m "feat: 新增a.txt文件"
第二步
vi b.txt // 新增 b.txt 文件
git add b.txt
第三步
vi c.txt // 新增 c.txt 文件
咱们运用 git status 检查状况
咱们能够看到 a.txt 已提交到版别库里边,所以a.txt这儿看不到;b.txt 在暂存区中, c.txt在作业区。
咱们运用 git log 检查前史纪录:(git log 检查到的有必要添加是履行了git commit 到资源库(Repository))
2.5 版别回退
2.5.1 作业区的回退
咱们先把上面栗子中的文件提交到资源库:
git add .
git commit -m "feat: 新增b,c模块"
然后在重新分别对b、c文件进行批改,在再次履行git status
git status
咱们能够看到, c.txt之前存在版别库中,咱们需求把批改丢掉。 d.txt在版别库中没有,所以咱们需求删去文件。 运用如下指令:
git checkout c.txt(把c.txt批改的丢掉)
rm d.txt
总结:
- 关于版别库中存在的文件运用 git checkout 指令抛弃批改,全部们见抛弃批改运用git checkout .
- 关于版别库中不存在的文件运用 rm 指令删去文件
2.5.2 暂存区回退
当文件已提交到暂存区,咱们应该怎么回退呢?咱们先来批改一些文件,而且提交到暂存区
批改a.txt文件
新增b.txt文件
git add .
git status
运用如下指令移除暂存区,让文件回到作业区,然后运用上一节的办法丢掉批改
git reset HEAD 文件名 或许全部移运用: git reset HEAD .
git status
总结:
- 运用 git reset HEAD 指令使文件移除暂存区,回到作业区
2.5.2 资源库版别切换
咱们先检查一下前史:
git log
咱们查到了版别对应的git的id,接下来运用下面指令回退到之前提交的’项目初始化’这一版别,履行完之后在git status 发现咱们现在目录内容回到最初的样子了
git reset --hard dfa4391707f9a64baa8eecf94e07e01a959fa091
git status
留意:假设忽然咱们发现自己回退错版别了,需求回退到 “新增a.txt文件模块”的那个版别,咱们能够运用下面指令找到所以变更的版别前史:
git reflog
PS:咱们常常看到 git reset –hard HEAD^ 这样的指令, 这句话表明抛弃批改的内容,回退当时的版别,HEAD 表明当时版别,HEAD^ 表明上一个版别, HEAD~100表明上100个版别
总结:
- 运用git reset –hard <版别号> 进行版别切换
- 运用git reflog 检查一切的版别变更前史
- HEAD 表明当时版别
3 分支
3.1 分支介绍
分支便是科幻电影里边的平行世界,当你正在电脑前努力学习Git的时分,另一个你正在另一个平行世界里努力学习SVN。 假设两个平行世界互不干扰,那对现在的你也没啥影响。不过,在某个时间点,两个平行世界兼并了,成果,你既学会了Git又学会了SVN!
分支在实践中有什么用呢?假定你准备开发一个新功用,可是需求两周才干完结,第一周你写了50%的代码,假设马上提交,由于代码还没写完,不完整的代码库会导致他人不能干活了。假设等代码全部写完再一次提交,又存在丢失每天进度的巨大危险。
现在有了分支,就不用怕了。你创立了一个属于你自己的分支,他人看不到,还继续在本来的分支上正常作业,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性兼并到本来的分支上,这样,既安全,又不影响他人作业。
其他版别操控体系如SVN等都有分支办理,可是用过之后你会发现,这些版别操控体系创立和切换分支比蜗牛还慢,简直让人无法忍受,成果分支功用成了摆设,咱们都不去用。
但Git的分支是与众不同的,无论创立、切换和删去分支,Git在1秒钟之内就能完结!无论你的版别库是1个文件还是1万个文件。
3.2 分支的创立、兼并以及删去
当咱们创立新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表明当时分支在dev上:
你看,Git创立一个分支很快,由于除了添加一个dev指针,改改HEAD的指向,作业区的文件都没有任何改变!
不过,从现在开端,对作业区的批改和提交便是针对dev分支了,比方新提交一次后,dev指针往前移动一步,而master指针不变:
假设咱们在dev上的作业完结了,就能够把dev兼并到master上。Git怎么兼并呢?最简略的办法,便是直接把master指向dev的当时提交,就完结了兼并:
所以Git兼并分支也很快!就改改指针,作业区内容也不变!
兼并完分支后,乃至能够删去dev分支。删去dev分支便是把dev指针给删掉,删掉后,咱们就剩下了一条master分支:
下面开端实战:
1)创立分支
git checkout -b dev
git checkout指令加上-b参数表明创立并切换,相当于以下两条指令:
git branch dev (创立dev分支)
git checkout dev (切换到dev分支)
2) 检查分支
git branch
3)批改文件并提交
批改 a.txt 文件里的内容
git add .
git commit -m "feat: a模块新增一行"
4)兼并dev到master
git checkout master // 切回master分支
git merge dev // 兼并dev分支到master
履行cat a.txt 就能够看到a.txt文件里边的内容了
4)删去dev分支,履行 git branch -d dev
总结
1)Git鼓励大量运用分支:
检查分支:git branch
创立分支:git branch <name>
切换分支:git checkout <name>或许git switch <name>
创立+切换分支:git checkout -b <name>或许git switch -c <name>
兼并某分支到当时分支:git merge <name>
删去分支:git branch -d <name>
2)有文件存在作业区或许暂存区时,切换分支后,这些文件会原封不动的带到新的分支。
3.3 处理抵触
人生不如意之事十之八九,兼并分支往往也不是一帆风顺的。
咱们先批改一下master分支的a.txt文件
git add .
git commit -m "feat: 新增一行master"
咱们再切到qa分支上,批改a.txt文件
git checkout -b qa
git add .
git commit -m "feat: 新增一行qa"
然后咱们再master分支兼并一下
git checkout master
git merge qa
git status
Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容。 ======= 上面的内容为当时分支的内容,下面的为兼并过来分支的内容咱们做相应的批改,然后提交.
git add .
git commit -m "chore: 处理qa兼并到master的抵触"
小结:
- 当Git无法主动兼并分支时,就有必要首要处理抵触。处理抵触后,再提交,兼并完结。
- 处理抵触便是把Git兼并失利的文件手动编辑为咱们希望的内容,再提交。
3.4 bug分支
软件开发中,bug就像粗茶淡饭相同。有了bug就需求批改,在Git中,由于分支是如此的强壮,所以,每个bug都能够通过一个新的暂时分支来批改,批改后,兼并分支,然后将暂时分支删去。
当你接到一个批改一个代号101的bug的任务时,很自然地,你想创立一个分支bug-101来批改它,可是,等等,当时正在dev上进行的作业还没有提交:
咱们能够运用 stash指令把批改贮藏起来
git stash
git status
咱们再创立bug-101分支进行批改
git checkout -b bug-101
新建b.tex,并进行批改一下
git add .
git commit -m "fix: 批改bug101"
切回master分支,而且兼并
git checkout master
git merge --no-ff -m "chore: bug101兼并到master上" bug-101
取出贮藏的批改
git stash pop
咱们发现b.txt文件抵触了,依据上面的内容处理抵触就能够了。
总结: 批改bug时,咱们会通过创立新的bug分支进行批改,然后兼并,最后删去; 当手头作业没有完结时,先把作业现场git stash一下,然后去批改bug,批改后,再git stash pop,回到作业现场。 一般咱们都是切独立分支批改的,所以这个办法咱们用的不是特别多。
4 长途库房的运用
上面的章节里边,咱们介绍了git的本地运用,知道了在本地各版别之间进行络绎。 但这仅限于咱们自己玩,假设要咱们一同作业完结一个项目,必然需求长途库房。
虽然git是分布式的,咱们能够彼此传输文件,但其实很少在两人之间的电脑上推送版别库的批改,由于或许你们俩不在一个局域网内,两台电脑相互拜访不了,也或许今天你的搭档病了,他的电脑压根没有开机。因而,分布式版别操控体系一般也有一台充当“中心服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”咱们的批改,没有它咱们也相同干活,只是交换批改不方便而已。而为了方便办理,咱们一般会把保管渠道选为“中心服务器”。
4.1 保管渠道(github拓宽)
保管渠道能够是第三方供给的,如github,码云等,也能够是咱们自己搭建的(公司运用gogs自己搭建了一个)。各种保管渠道操作迥然不同,下面我就用第三方供给的github来当作咱们的“中心处理器”。
- github 网址:github.com/ 接下来咱们在github上新建一个项目:
1) 注册登陆github
2) 新建库房
4.1.1 本地库房与长途库房相关
在库房页面,咱们有两种相关库房的方法,咱们运用SSH的方法来相关。
留意: 第一次相关长途库房之前最好先配置下用户邮箱和姓名,这样在提交到长途库房的时分git知道你是谁
git config –global user.name”zhangzhengzhou”
git config –global user.email”834228829@qq.com”
履行下面指令:
git remote add origin git@github.com:zhangzhengzhou/yanshi.git
git push -u origin main(第一次提交一定要带上-u)
履行完结后会报一个权限验证不通过的错误。
要消除这个错误,需求把咱们服务器的SSH公钥放到github上
4.1.2 生成ssh公钥
咱们运用下面指令生成公钥和私钥。 1.验证下本地有没有生成.ssh文件,假设没提示阐明本地有了 反之要去生成.ssh
2.本地没有ssh 履行以下指令
ssh-keygen -t rsa 或许 ssh-keygen -t rsa -C "your@email.com"
之后履行 cd ~/.ssh 去检查有没有提示 没提示阐明已生成
一般生成的路径如下
把公钥的内容复制到github上。
点击承认之后,要输入github的登录暗码进行承认
咱们再履行一次,就能够把master 分支推到长途库房中去了。
git push -u origin master
- u :代表相关的主机
- origin:代表长途库房源
推送长途库房成功!
小结:
- 咱们运用 git remote add origin <长途地址> 相关长途库房
- 第一次运用 git push -u origin master 推送
- 运用SSH协议,需求配置SSHkey
- 今后再次推送直接运用 git push 即可
4.1.3 推送长途分支和删去长途分支
咱们把qa分支推送到长途库房:
git checkout qa
git push origin qa //第一次运用和长途qa分支想相关
github 里边的提交记载
运用下面指令来删去长途分支:
git push origin --delete qa
检查长途分支用git branch -r
4.1.4 从长途库房克隆
假设咱们本地没有库房,需求把线上的库房克隆下来,能够运用下面的指令,这儿咱们运用http的方法
git clone https://github.com/.git -b qa yanshi
咱们来解释一下里边的两个参数
-
-b qa: 表明克隆qa分支,假设不加,默认拷贝master分支
-
yanshi: 把克隆下来的内容放在”yanshi”文件夹下面 小结:
-
运用 git clone git@github.com:zhangzhengzhou/yanshi.git [-b 分支名] [目录名] 来克隆库房
-
咱们不主张运用htts的方法,由于https除了慢,还要常常输入口令(即github或许gitlab的登录账号和暗码)十分麻烦
思考题
假设咱们长途分支推错了怎么办?
4.2保管渠道(gitlab 主讲)
4.2.1 创立项目
1)创立项目
挑选Private项
- Private:项目拜访权有必要清晰授予每个用户
- Internal:任何登录的用户都能够拜访该项目
- Public: 无需任何身份验证即可拜访该项目
4.2.2 本地库房与长途库房相关同目录4.1.1
4.2.3 同生成ssh公钥目录 4.1.2
4)同4.1.4 从长途库房克隆
5 Pull Request 的指令行办理
5.1 Pull Request介绍
“Pull Request 是一种告诉机制。你批改了他人的代码,将你的批改告诉本来的作者,希望他兼并你的批改,这便是 Pull Request。
5.2 Pull Request 的流程
github的pull requst
gitlab的流程
第一步,你需求把他人的代码,克隆clone到你自己的库房,Github 的术语叫做 fork。
比方定义他人的库房定义为A,克隆到你自己的库房B
接着咱们要在自己的库房里边clone到本地,进行一些列的add、commit、push批改提交
然后进行merge requests
承认提交信息
接下来咱们就能够在A 也便是他人的库房里边就能够收到merge requests 的请求记载列表,
检查是否进merge和并
5.3 删去自己库房fork的项目
点击删去的弹框里边 一定要输入项目名称例如BdBiProcSrvShEduOmc_ForeEndWeb 不然不能confirm承认
6. 操作git的两种作业流程
1)第一种 把长途的dev分支拷贝到本地
- 把长途的dev分支拷贝到本地
- 批改dev分支,并push给长途库房
- 长途库房把dev分支兼并到qa
- 长途库房把qa兼并到prod
2)第二种 从长途prod分支check出一个tmp分支
- 从长途prod分支check出一个tmp分支
- 批改tmp分支,把tmp分支兼并到长途库房的dev
- 把tmp分支兼并到长途库房的qa
- 把tmp分支兼并到长途库房的prod
思考题:
这两种方法孰优孰劣?咱们应该怎么挑选?
7 拓宽: vscode的装置和运用git
地址:code.visualstudio.com/
vscode有内置的git插件,所以无需装置,当然你也能够运用其他git插件辅佐(比方SourceTree客户端)
SourceTree客户端
打开对应的文件夹即可