一、Git
先入为主: Git 其实就是个版本控制工具,多人协作工具等,一般用于公司的开发和文档的编写。
1、可以进行多人协作开发(写作)
2、可以有历史记录,随时回退到任意时刻。
1、Git的介绍
Git的创始人是Linus Torvalds, 也是Linux的创始人。
行业内比较有名的版本控制工具:
CVS(老了)
SVN(还行,在git之前很火)
Git(刚开始只有Linux)
我还用过StarTeam(收费的)
总结:目前市场上使用的是SVN和Git
SVN是集中式版本控制系统,版本库是集中放在中央服务器的。
局域网的一个电脑而
Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。既然每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
大白话来讲:
你如果使用Git ,你的本地就会有一个本地库,代码可以提交到本地库里面。比如 Hello.py 提交到本地库,过了两天又提交了Hello.py 到本地库,Git 如果自己使用是完全可以的,不需要中央服务器。
如果使用的是SVN,你写了一个Hello.py 要提交到中央服务中,因为本地没有本地库。所以没办法工作。
2、Git的安装
1) 安装的Git
下载链接:Git - Downloads
下一步下一步安装即可!
安装完之后起始就可以使用了,只是必须使用 命令才能完。
不想学命令,可以直接跳过。可以使用图形化界面。
2) 安装小乌龟 TortoiseGit
Tortoise --乌龟的意思,寓意公司千年企业。
这个企业以前做了一个软件:TortoiseSVN
先安装软件:
再安装汉化包:
原因是可以在安装小乌龟的时候,选择语言为中文,要不然就是随后再设置:
语言包安装完毕之后,刷新一下,就出现简体中文了。
配置开发者姓名及邮箱,每次提交代码时都会把此信息包含到提交的信息中。
此处写上自己的名字的全拼,邮箱写一个自己经常使用的邮箱。
使用默认配置,点击“完成”按钮完成配置。
完整完毕后在系统右键菜单中会出现git的菜单项。
1)Git 是官网给的,必须安装
2)小乌龟是第三方公司开发的,是为了方便使用才安装的,可以不安装
语言包安装完毕后可以在TortoiseGit的设置中调整语言
忘记设置用户名和邮箱了:
3、Git的使用场景
1、除了开发人员,公司中的其他非开发同事也是可以使用的,比如项目经理。
2、在公司中大部分人是使用Git管理代码的
4、使用git管理文件版本
需求:
假如你自己想使用Git 作为版本控制工具,比如你在写书。
为了防止本地的丢失,误删,或者是为了回看之前的版本,都可以使用Git。
1)创建版本库
第一种是使用Git原生的命令:
在需要进行版本控制的文件夹中,右键,选择 Git Bash Here
repository 是仓库的意思,本地已经帮你创建了一个本地库
什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。由于git是分布式版本管理工具,所以git在不需要联网的情况下也具有完整的版本管理能力。
第二种是使用小乌龟操作:
确认
2)添加文件
如果是一个新的文件,选中这个文件,然后右键点击 “添加按钮”,这个文件会进入暂存区。
暂存区的内容 再次提交,会进入到本地库中。
说一下原理:
3) 修改文件
打开文件,修改内容,修改完之后,直接提交即可,没有“添加”功能。
4)查看历史
可以在文件上点击右键选择“显示日志”来查看文件的修改历史。
5) 比较版本的差异
比较这个版本和上一个版本的差异:
也可以通过查看日志,选择两个想要比较的版本,进行差异比较:
6) 还原
当文件修改后不想把修改的内容提交,还想还原到未修改之前的状态。此时可以使用“还原”功能。
7)可以回退到某个版本
查看历史,选中某个版本,回退回去
Git 可以 将本地的文件上传到本地库,还可以比较两个不同版本的区别,回退到某个历史版本,还可以还原本地的文件等。
5 使用 Git 管理代码
1、进入到项目所在的文件夹中,右键 创建本地库
2、选中需要提交的代码文件即可。
6、远程仓库
maven也有,但是git也有,他们两个没什么关系。
两种方式都可以当做远程仓库:
1) 第三方的网站
GitHub (全球的) : 这个网站涵盖了全球顶级的开源项目
GitHub: Let’s build from here · GitHub
另一个是码云: Gitee - 企业级 DevOps 研发效能平台
1.1.1 在github上创建仓库
首先你得在github上创建一个账号,这个就不演示了。然后在github上创建一个仓库
git@github.com:erjinzhi/myLaoBaby.git
这个地址是使用的SSH协议,该协议是一种非常安全的协议,要想使用该协议连接远程仓库,需要先生成公钥和私钥。
在windows下我们可以使用 Git Bash.exe来生成密钥,可以通过开始菜单或者右键菜单打开Git Bash
ssh-keygen -t rsa
至此,你就在本地生成了一个公钥和私钥。
执行命令完成后,在window本地用户.ssh目录C:\Users\用户名\.ssh下面生成如下名称的公钥和私钥:
带有pub 字样的是公钥!!!
将公钥的字符串,配置在Github上:
此时,本地和远程仓库之间,已经产生了某种联系。
接着配置小乌龟中的远程地址:
假如没有发现远端这个操作,可以直接提交代码,将其逼出来。
接着见证奇迹的时刻到了:
在文件夹中,右键,选择 “推送”,上传至远程仓库!!!
思考:为什么没有让你输入你的账号和密码? 因为配置了公钥,使用的是SSH协议。已经验证过了。
假如你弹出这个界面,说明ssh并没有起作用,检查是否协议选择错误!
Gitee (码云) : 国内做的非常不错的网站,也是有很多的开源项目 (开源中国)
git@gitee.com:yanzhenwei/my-lao-baby.git
接着在你的码云上,创建一个SSH的Key:
右键 --> 推送
如何将远程的项目clone 到本地:
先知道地址: git@gitee.com:yanzhenwei/ZhunDemo.git
git clone git@gitee.com:yanzhenwei/ZhunDemo.git
2)公司自己搭建的服务器 GitLab
有些公司:不想使用第三方的平台,自己搭建一个类似于GitHub的平台。
比如大数据团队多人协作,使用的就是自己搭建的。
7、git在IDE工具中的使用
IDE工具:开发工具 IDEA、Eclipse、NetBeans
以下这个图想要说明的是为什么有了IDE工具还要小乌龟。
为什么要讲这个章节呢?
1.1 在Idea中配置git
生成token的办法:
idea-使用idea的github添加账号连接github报错 - 知乎
新版本会弹出页面让其授权。
1.2 在IDE工具中配置gitee的支持
gitee账户得先注册一个。
第一步:安装插件 idea 默认是不支持gitee的,支持github.
第二步:添加gitee账户
跳转界面(新版本有弹出界面),进行授权:
成功登陆:
1.3 使用场景
第一个使用场景:我想把本地的项目上传到gitee上
问自己:本地的项目,你使用git管理了吗?
成功
我就把远程不存在的项目,给上传上去了,不需要事先把仓库建好!
一般这个操作都是公司的技术总监,架构师,项目经理将自己本地的项目上传。
第二个使用场景:我想把gitee上的项目全部给拉下来(clone)-- 小兵
下载自己的远程仓库的项目:
下载别人的项目:
git@gitee.com:yanzhenwei/HbaseDemo2.git
点击clone 即可。
第三个使用场景:使用IDE工具把代码给管理起来
先创建一个TestWork.py ,立马提示:是否通过git管理:
提交到:本地库
接着开始文件,推送到远程仓库!
第四个使用场景:我想给团队一起协作
如何下载团队的其他人的最新的代码呢?
假如你写的代码被别人给修改了,这个时候你也改了?冲突了!
此时如果你修改了代码,推送就会报错:
点击合并后,赶紧上传吧,别得瑟了。
如何进行团队开发:
1、git 是什么?
是一个小工具,有一个安装包
2、小乌龟是什么?
git的图形化操作工具,便于我们操作git,如果没有他,只能使用命令了。
3、idea 跟git什么关系?
idea 集成了git,所以如果你只是写代码的小兵,其他的用不上,直接使用ide工具即可,不需要下载小乌龟。
现在主流的IDE工具都支持git。
4、github、gitee 是什么?
git的远程仓库,可以远程保存代码,便于团队协作。
5、gitLab 是什么?
开源的,可以自己搭建的git服务器的软件而已。
8、分支
1)使用小乌龟操作分支
里面写上一些文件,比如11111111,提交到本地库,实际上提交到master分支。
创建新的分支:
在a.txt 中添加了些文字,此时提交的话,是提交的到分支这个里面,主分支并没有发生变化。
如何切换到主分支呢?
在主分支,修改一些文字,提交,相当于是主分支添加了一些文字,从分支也添加了一些文字。
两个分支合并。
有可能会出现冲突的问题,手动解决,再次提交即可。
2)使用idea工具操作分支
在代码的右下角,可以看到分支目前是在哪个分支中。
填写分支的名字:
接着合并:先切换到主分支,然后合并
合并:
删除分支:
课后练习:
CREATE TABLE emp(
empno INT,
ename VARCHAR(50),
job VARCHAR(50),
mgr INT,
hiredate DATE,
sal DECIMAL(7,2),
comm decimal(7,2),
deptno INT
);
INSERT INTO emp values(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20);
INSERT INTO emp values(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30);
INSERT INTO emp values(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30);
INSERT INTO emp values(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20);
INSERT INTO emp values(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30);
INSERT INTO emp values(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30);
INSERT INTO emp values(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10);
INSERT INTO emp values(7788,'SCOTT','ANALYST',7566,'1987-04-19',3000,NULL,20);
INSERT INTO emp values(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10);
INSERT INTO emp values(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30);
INSERT INTO emp values(7876,'ADAMS','CLERK',7788,'1987-05-23',1100,NULL,20);
INSERT INTO emp values(7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30);
INSERT INTO emp values(7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20);
INSERT INTO emp values(7934,'MILLER','CLERK',7782,'1982-01-23',1300,NULL,10);
CREATE TABLE dept(
deptno INT,
dname varchar(14),
loc varchar(13)
);
INSERT INTO dept values(10, 'ACCOUNTING', 'NEW YORK');
INSERT INTO dept values(20, 'RESEARCH', 'DALLAS');
INSERT INTO dept values(30, 'SALES', 'CHICAGO');
INSERT INTO dept values(40, 'OPERATIONS', 'BOSTON');
select * from emp;
select * from dept;
-- 以上是数据导入
-- 1、⼯资⾼于JONES的员⼯
select sal from emp where ename ='JONES';
select * from emp where sal> (select sal from emp where ename ='JONES');
-- 2、查询与SCOTT同⼀个部⻔的员⼯
select * from emp where deptno = (select deptno from emp where ename='SCOTT') and ename !='SCOTT';
-- 3、⼯资⾼于30号部⻔所有⼈的员⼯信息
-- 30号部门的最高工资是多少?
select max(sal) from emp where deptno=30;
select * from emp where sal > (select max(sal) from emp where deptno=30);
-- 4、查询⼯资⼤于10号部⻔的平均⼯资的⾮10号部⻔的员⼯信息
select avg(sal) from emp where deptno=10;
select * from emp where sal > (select avg(sal) from emp where deptno=10) and deptno != 10;
-- 5、查询与7369同部⻔的同事信息
select * from emp where deptno = (select deptno from emp where empno=7369) and empno !=7369;
-- 6、查询员⼯的姓名,⼯资,及其部⻔的平均⼯资
select deptno,avg(sal) from emp group by deptno;
-- 第一种写法
select ename,sal,avgSal from emp ,(select deptno,avg(sal) avgSal from emp group by deptno) a1
where emp.deptno = a1.deptno;
-- 第二种写法
select ename,sal,`avg(sal)` from emp ,(select deptno,avg(sal) from emp group by deptno) a1
where emp.deptno = a1.deptno;
-- 第三种写法
select ename,sal,(select avg(sal) from emp e2 where e2.deptno=e1.deptno) as avgSal from emp e1;
-- 解释工作
select ename,sal,e1.deptno,(select avg(sal) from emp e2 where e2.deptno=10) as avgSal from emp e1;
select ename,sal,e1.deptno,(select avg(sal) from emp e2 where e2.deptno=e1.deptno) as avgSal from emp e1;
-- 7、查询每个员⼯的信息及其部⻔的平均⼯资,⼯资之和,部⻔⼈数
select *,
(select avg(sal) from emp e2 where e2.deptno=e1.deptno) as avgSal,
(select sum(sal) from emp e2 where e2.deptno=e1.deptno) as sumSal,
(select count(1) from emp e2 where e2.deptno=e1.deptno) as countNum
from emp e1;
-- 8、查询平均⼯资⼤于30号部⻔的平均⼯资的部⻔号,和平均⼯资
select avg(sal) from emp where deptno=30;
-- sql中,having 以及 order by 等可以使用别名,where后面不能使用别名
select deptno,avg(sal) avgSal from emp group by deptno having avgSal > (select avg(sal) from emp where deptno=30);
-- 9、查询所有员工信息以及工资总和
select *,(select sum(sal) from emp) sumSal from emp;
-- 10、查询所有员工人数不少于3人的部门信息
select deptno,count(1) from emp group by deptno;
-- 分组sql语句中,select 后面只能跟 分组字段和聚合函数
-- 解释,有意的写法
select deptno,count(1) from emp group by deptno having count(1) >=3;
-- 没有意义的写法
select deptno,count(1),ename,job from emp group by deptno having count(1) >=3;
-- 正确的写法:
select deptno,count(1) from emp group by deptno having count(1) >=3;
select dept.* from dept,(select deptno,count(1) from emp group by deptno having count(1) >=3) d
where dept.deptno=d.deptno;
-- 11、查询员工编号,姓名,部门编号,工资,本部门工资总和
select empno,ename,deptno,sal,(select sum(sal) from emp e1 where e1.deptno=e2.deptno) as 部门总工资 from emp e2;
-- 12、查询每个员工的姓名和上级领导的姓名
select ename,(select ename from emp e2 where e1.mgr = e2.empno) as 领导的名字 from emp e1;
-- 13、查询没有员工的部门 (exists用法)
select * from dept where not exists (select 1 from emp where emp.deptno=dept.deptno);
-- 不使用exists
select * from dept where deptno not in (select distinct deptno from emp );