1、Git
1.1、概述
- Git是一个免费的、开源的分布式版本控制系统 ,可以快速高效地处理从小型到大型的各种项目
- Git易于学习,占地面积小,性能 极快 。 它具有廉价的本地 库 ,方便的暂存区域和多个工作
流分支等特性。 其性能优于 Subversion、 CVS、 Perforce和 ClearCase等 版本控制 工具。 - 官网
1.2、版本控制
- 版本控制是一种记录文件内容变化,以便将来查阅特定版本修订情况的系统
- 版本控制其实最重要的是可以记录文件修改历史记录,从而让用户能够查看历史版本,方便版本切换
1.3、版本控制工具
集中式版本控制工具
- CVS、SVN、VSS
- 集中化的版本控制系统能够注入CVS、SVN等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连接到这台服务器,取出最新的文件或者提交更新。多年以来,这已成为版本控制系统的标准做法
- 这种做法带来了许多好处,每个人都可以在一定程度上看到项目中的其他人在做些什么。而管理员也可以轻松掌控每个开发者的权限,并且管理一个集中化的版本控制系统,要远比在各个客户端上维护本地数据库来得轻松
- 事分两面,有好有坏。这么做显而易见的缺点是中央服务器的单点故障,如果服务器宕机一小时,那么这一小时内,谁都无法提交更新,也就无法协同工作
分布式版本控制工具
- Git、Mercurial
- 像Git这种分布式版本控制工具,客户端提取的不是最新版本的文件快照,而是把代码仓库完整地镜像下来(本地库)。这样任何一处协同工作用的文件发生故障,事后都可以用其他客户端的本地仓库进行恢复。因为每个客户端的每一次文件提取操作,实际上都是一次对整个文件仓库的完整备份
- 分布式版本控制系统出现之后,解决了集中式版本控制系统的缺陷
-
- 服务器断网的情况下,也可以进行开发,因为版本控制是在本地进行的
- 每个客户端保存的也都是整个完整的项目,包含历史记录更加安全
1.4、Git简史
1.5、Git工作机制
1.6、Git和代码托管中心
代码托管中心是基于网络服务器的远程代码仓库,一般我们简单称为远程库
- 局域网
- GitLab
- 互联网
- GitHub(外网)
- Gitee码云(国内网站)
2、Git安装
官网下载
直接无脑下一步next
查看是否安装成功
右键任意位置,在右键菜单里选择Git Bash Here即可打开 Git Bash命令行终端。在Git Bash终端里输入 git --version
查看 git版本,如图所示,说明 Git安装成功
3、Git常用命令
命令名称 | 作用 |
---|---|
git config --global user.name 用户名 | 设置用户签名 |
git config --global user.email 邮箱 | 设置用户签名 |
git init | 初始化本地库 |
git status | 查看本地库状态 |
git add 文件名 | 添加到暂存区 |
git commit m " 日志信息 " 文件名 | 提交到本地库 |
git reflog | 查看历史记录 |
git reset hard 版本号 | 版本穿梭 |
3.1、设置用户签名
基本语法:
- git config --global user.name 用户名
- git config --global user.email 邮箱
并且在自己C:\Users\hj151
下有个.gitconfig
文件,打开里面就是我们设置的用户签名
说明:
签名的作用是区分不同作者身份,用户的签名信息在每一个版本的提交信息中能够看到,以此确认本次提交是谁做的,Git首次安装必须设置一下用户签名,否则无法提交代码
注意:这里设置用户签名和将来登录GitHub(或其他代码托管中心)的账号没有任何关系
3.2、Git初始化本地库
基本语法:git init
3.3、查看本地库状态
语法:git status
3.4、新增文件
语法:vim hello.txt
,然后按i进入INSERT,要想复制粘贴,需要先按Esc
,然后yy
复制,最后p
粘贴
文件内如输入完毕后按Esc
,然后按:
,再按wq
,才算完成新增文件,再次查看
3.5、添加暂存区
基本语法:git add 文件名
3.6、提交本地库
将暂存区的文件提交到本地库
语法:git commit -m "日志信息" 文件名
3.7、修改文件
语法:vim 文件名
3.7、历史版本
3.7.1、查看历史版本
语法:
git reflog
:查看精简版本信息git log
:查看版本详细信息
3.7.2 版本穿梭
语法:git reset --hard 版本号
这里的版本号是指用git reflog
命令查询出来的7位数版本号
3.7.2、版本穿梭原理
Git版本切换,底层其实是移动的Head指针,具体原理如下图所示
- head指针指向master分支,master分支指向first版本
- 之后有了second版本,masterr指针指向second版本
- 之后又有了third版本,master指针指向third版本
4、Git分支
4.1、什么是Git分支
- 在版本控制过程中,同时推进多个任务,为每个任务,我们就可以创建每个任务的单独分支
- 使用分支意味着程序员可以把自己的工作从开发主线上分离开来,开发自己的分支的时候,不会影响主线分支的运行
- 对于初学者而言,分支可以简单理解为副本,一个分支就是一个单独的副本
4.2、分支的好处
- 同时并行推进多个功能的开发,提高开发效率
- 各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响,失败的分支删除重新开始即可
4.3、分支的操作
命令名称 | 作用 |
---|---|
git branch 分支名 | 创建分支 |
git branch -v | 查看分支 |
git checkout 分支名 | 切换分支 |
git merge 分支名 | 把指定的分支合并到当前分支上 |
4.3.1、查看分支
基本语法:git branch -v
4.3.2、创建分支
基本语法:git branch 分支名
4.3.3、切换分支
基本语法:git checkout 分支名
4.3.4、修改分支文件
先git checkout 分支名
切换到要修改的分支
然后vim 文件名
修改分支文件
4.3.5、合并分支
基本语法:git merge 分支名
正常合并不冲突
合并产生冲突
冲突产生原因:
- 合并分支时,两个分支在同一文件的同一位置有两套完全不同的修改
- 有两套完全不同的修改,Git无法替我们决定使用哪一个,必须认为决定新代码内容
例如,我们首先在master分支的倒数第二行进行修改,并将其添加到暂存区,再提交到本地库
接着,我们切换到hot-fix分支,修改第五行代码,并将其添加到暂存区,再提交到本地库
之后我们在master分支上合并hot-fix分支,发现产生冲突
解决冲突
1、编辑有冲突的文件,删除特殊符号,决定要使用的内容
特殊符号<<<<<< HEAD
当前分支代码 =======
合并过来的代码 >>>>>> hot-fix
删除完成之后保存,再次添加到暂存区,并再次提交到本地库(注意使用git commit -m “注释信息”,不用文件名)
这里修改后,也只是master分支被修改了,切换回hot-fix分支的文件并未修改
5、Git团队协作机制
5.1、团队内协作
举个例子:
岳不群首先用git初始化自己的本地库,写了一套华山剑法,利用push命令将自己的本地库推送到代码托管中心(GitHub、Gitee),岳不群把大弟子冷狐冲拉进自己项目团队后,大弟子令狐冲可以通过clone命令将代码托管中心的代码完整复制到自己的本地库,令狐冲修改两招后将自己本地库的代码再次push到代码托管中心,这样岳不群就可以通过pull命令拉取令狐冲修改的代码,来更新自己的本地库。
5.2、跨团队协作
例子:
令狐冲请东方不败修改代码,东方不败通过fork命令从岳不群的远程库中拿取代码,再通过clone命令复制到自己的本地库,修改完成后使用push推送到自己的远程库,然后使用Pull request拉取请求给岳不群,岳不群审核后使用merge命令合并对方代码到自己的远程库,再通过pull命令拉取到自己的本地库,这样修改后的华山剑法岳不群和令狐冲就都可以使用了
6、GitHub
6.1、创建远程仓库
登录GitHub创建远程库
6.2、远程仓库操作
命令名称 | 作用 |
---|---|
git remote -v | 查看当前所有远程地址别名 |
git remote add 别名 远程地址 | 起别名 |
git push 别名 分支 | 推送本地分支上的内容克隆到本地 |
git clone 远程地址 | 将远程仓库的内容克隆到本地 |
git pull 远程库地址别名 远程分支名 | 将远程仓库对于分支最新内容拉下来后与当前本地分支直接合并 |
6.2.1、创建远程仓库别名
基本语法:
git remote -v
查看当前所有远程地址别名git remote add 别名 远程地址
起别名
注意:起的别名最好也跟本地库一致
6.2.3、推送本地分支到远程仓库
基本语法:git push 别名(或远程仓库地址) 分支
授权后,会提示推送成功,我们在GitHub上查看我们的git-demo仓库,发现有我们的hello.txt文件
6.2.4、拉取远程库分支到本地库
语法:git pull 别名 分支
我们在远程库进行hello.txt的修改
然后将远程库代码拉取到本地库
6.2.5克隆远程仓库到本地
基本语法:git clone 远程地址
我们另一台用户需要克隆我们的远程仓库到它的本地仓库,由于使用一台电脑模拟,所以在克隆之前需要在凭据管理器
中删除我们之前的GitHub凭据
我们在D盘下新建一个文件夹git-clone,然后在此文件夹下右键git bash here,之后执行命令进行克隆
小结:clone会做如下操作。1、拉取代码 2、初始化本地仓库 3、创建别名
6.3、邀请加入团队
6.3.1、团队内协作
我们在git-clone的git-demo(假设这是大弟子令狐冲)下操作,执行vim hello.txt
修改文件,然后添加到暂存区,最后提交到本地库
我们在GitHub上,在对应仓库添加成员
在 atguigulinghuchong这个账号 中的 地址 栏 复制 收到邀请 的 链接 ,点击接受邀请
然后令狐冲就可以push,岳不群也可以pull或clone,查看令狐冲的修改
6.3.2 跨团队协作
1、将远程仓库地址复制发给邀请跨团队协作的人,比如东方不败
2、然后东方不败的GitHub账号里的地址栏复制收到的链接,然后Fork到自己的远程库
3、东方不败就可以在自己的远程库中操作这个仓库里的文件,修改完成后,提交
4、岳不群可以在Pull Request中审核东方不败的请求
6.4 SSH免密登录
在C盘下自己的用户目录下右键git bash here
,输入命令ssh-keygen -t rsa -C 自己的邮箱名
在此目录下,右键git bash here
这样会生成.ssh文件夹,里面含有私钥和公钥
之后在GitHub上添加公钥
接下来再往远程仓库push东西的时候使用SSH连接就不需要登录了
7、IDEA集成Git
7.1、配置Git忽略文件
我们使用IDEA时会生成一些无关文件,如图
- Eclipse特定文件
- IDEA特定文件
- Maven项目的target目录
我们之所以要忽略它们,是因为它们与项目的实际功能无关,不参与服务器部署运行
如何忽略?
1、在C盘用户hj151目录下创建git.ignore文件
以下为文件内容:
# Compiled class file
*.class
# Log file
*.log
# BlueJ files
*.ctxt
# Mobile Tools for Java (
.mtj.
# Package Files
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# virtual machine crash logs, see
http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
.classpath
.project
.settings
target
.idea
*.iml
2、在.gitconfig文件中引用忽略配置文件(.gitconfig在C盘用户hj151目录下)
[user]
name = Augenestern
email = .....@qq.com
[core]
excludesfile = C:/Users/Augenestern/git.ignore
3、在IDEA里面定位git运行程序git.exe
7.2、IDEA初始化本地库
默认创建的git仓库就是我们打开的项目所在的目录,我们添加了git仓库之后
文件添加到暂存区后变为了绿色,我们可以写些代码,然后将Project添加到暂存区
这样所有文件都添加到了暂存区,接下来就是提交到本地库了
7.3、版本切换
修改TestGit里面的代码,再次添加到暂存区以及提交到本地库,操作参照上面
在IDEA左下角,点击Git,然后点击Log查看版本日志信息,右键选择要切换的版本,然后在菜单里点击Checkout Revision
7.4、创建分支
右键项目–>Git–>Branches
或者IDEA中右下角master
弹出框中填写分支名称
然后在IDEA右下角可以看到hot-fix,表示分支创建成功,并且已经切换成hot-fix分支
7.5 切换分支
在IDEA窗口右下角,切换回master分支
7.6 合并分支
7.6.1、合并无冲突
首先切换到hot-fix分支,修改TestGit内容,然后添加到本地库
切换回master分支,然后合并分支
合并成功,可以在master分支中看到TestGit中,hot-fix修改后的完整内容
7.6.2、合并有冲突
如下图所示,如果master和hot-fix分支都修改了代码,在合并分支的时候就会发生冲突
切换回master分支进行合并操作,就会发生代码冲突
点击Confilcts框里的Merge按钮,进行手动合并代码
手动合并完成后,自动提交到本地库。
8、IDEA集成GitHub
首先在IDEA中绑定GitHub账户,步骤如下:
从GitHub官网生成token,settings–>Develop Settings
然后在IDEA中绑定
8.1、分享项目到远程库
Share之后直接帮我们在GitHub上创建了远程库,并且执行了推送操作
可以直接在GitHub上查看项目了
8.2、push推送本地库到远程库
可以右键点击项目,也可以直接点击工具栏Git,将当前分支push到GitHub远程库中
点击push即可
8.3、pull拉取远程库到本地库
注意:
push是将本地库代码推送到远程库,如果本地库代码跟远程库代码版本不一致,push的操作可能是会被拒绝的,也就是说,要想push成功,一定要保证本地库的版本要比远程库的版本高!因此一个成熟的程序员在动手改本地代码之前,一定要先检查远程库代码跟本地库的区别,如果本地库的代码已经落后,切记要先pull拉取一下远程库的代码,将本地库代码更新到最新以后,然后再修改、提交、push
- 右键点击项目,可以将远程仓库的内容pull到本地仓库
注意:pull是拉取远程库到本地库,如果远程库代码和本地库代码不一致,会自动合并,如果自动合并失败,还会涉及手动解决冲突的问题
8.4、clone克隆远程库到本地库
9、IDEA集成Gitee
9.1、码云Gitee创建远程仓库
9.2、IDEA安装码云插件
IDEA默认没有安装码云插件,我们第一步要先去settings–>Plungins–>marketplace中下载
安装好后重启IDEA即可
IDEA中集成Gitee跟集成GitHub差别并无二致,首先在IDEA里面创建一个项目,然后初始化这个项目,添加到暂存区,提交本地库
9.3、分享项目到Gitee
9.4、push推送到码云远程库
当然我们也可以自己在码云Gitee上创建远程库,然后获取到远程库的HTTPS/SSH链接,将我们的代码push即可
自定义远程库链接:Define remote,给远程库链接定义一个name,然后在URL里面填入Gitee上远程库HTTPS链接即可,码云服务器在国内,用HTTPS链接即可,没必要用SSH免密链接
9.5、pull拉取远程库到本地库
我们在Gitee上修改代码,然后使用IDEA pull拉取远程库代码
9.6、Clone克隆Gitee的代码到本地库
9.7、码云复制GitHub的项目
码云提供了直接复制GitH项目的功能,方便我们做项目的迁移和下载
如果GitHub上更新项目后,在码云项目端可以手动同步更新
10、自建代码托管平台GitLab
10.1、GitLab简介
GitLib是由GitLabInc开发,使用MIT许可证的基于网络的Git仓库管理工具,且具有Wiki和Issue跟踪功能,使用Git作为代码管理工具,并在此基础上搭建起来的web服务。
GitLab由乌克兰程序员DmitriyZaporozhets和ValerySizow开发,它使用Rubby语言写成,后来,一些部分用Go语言重写,截止2018年5月,该公司约有290名团队成员,以及2000多名开源贡献者,GitLab被IBM、Sony、JulichResearchCenter、NASA、Alibaba、Invincea、O‘ReillyMedia、Lebniz-Rechenzentrum(LRZ)、CERN、SpaceX等组织使用
10.2、GitLab官网地址
10.3、GitLab安装
10.3.1、服务器准备
准备一个系统为CentOS7以上版本的服务器,要求内存4G,磁盘50G
关闭防火墙,并且配置好主机名和IP,保证服务器可以上网
10.3.2、安装包准备
Yum在线安装gitlab-ce时,需要下载几百M的安装文件,非常耗时,所以最好提前把所需的RPM包下载到本地,然后使用离线RPM的方式安装
下载地址:
。。。。。。后续以后再更。。。。。。