1.Git简介
1.1Git概述
Git是一个免费的、开源的分布式版本控制系统,可以快速高效地处理从小型到大型的各种项目
1.1.1版本控制
版本控制工具可以分为两类
- 集中式版本控制工具:如SVN
集中式版本控制工具都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。缺点是:当服务器宕机后,不能进行提交和协同操作
- 分布式版本控制工具:如Git
分布式版本控制工具,客户端提取的不是最新版本的文件快照,而是把代码仓库完整地镜像下来(本地库)。这样任何一处协同工作用的文件发生故障,事后都可以用其他客户端的本地仓库进行恢复。因为每个客户端的每一次文件提取操作,实际上都是一次对整个文件仓库的完整备份
1.1.2Git工作机制
-
工作区(代码存放的本地磁盘位置):写代码
-
暂存区:临时存储 git add,将工作区代码添加到暂存区
-
本地库:历史版本 git commit,将暂存区提交到本地库,会生成历史版本,删不掉了
1.2Git安装
官网地址:https://git-scm.com/
直接在官网安装,无脑下载即可
右键-git bash:打开命令行,即可输入命令使用,Git里面Linux命令是通用的,可以尽情使用Linux进行文件操作
1.3Git命令
常用命令:
命令名称 | 作用 |
---|---|
git config --global user.name 用户名 | 设置用户签名 |
git config --global user.email 邮箱 | 设置用户签名,可以设置虚拟邮箱 |
git init | 初始化本地库 |
git status | 查看本地库状态 |
git add 文件名 | 添加到暂存区 |
git commit -m “日志信息” 文件名 | 提交到本地库 |
git reflog | 查看历史记录 |
git reset --hard 版本号 | 版本穿梭 |
1.3.1设置用户签名
基本语法:
- 【git config --global user.name 用户名】
- 示例:git config --global user.name 陈丹
- 【git config --global user.email 邮箱】
- 示例:git config --global user.email chen.dan37@byd.com,邮箱可使用虚拟的,git不会去验证
- 设置完成后可在【C盘-用户-.gitconfig】文件中看到配置
签名的作用是区分不同操作者身份,用户的签名信息在每一个版本的提交信息中能够看到,以此确认本次提交者
注意:Git首次安装必须设置一下用户签名,否则无法提交代码。这里设置用户签名和将来登录GitHub(或其他代码托管中心)的账号没有任何关系
1.3.2初始化本地库
基本语法:
- 【git init】
进入需要管理的目录下,右键-git bash执行上述命令,则会在该目录下生成.git目录,即初始化成功,可被git管理
1.3.3查看本地库状态
基本语法:
- 【git status】
可使用git status查看状态,下图显示存在有"src/test/"文件未被追踪(即只存在于工作区,未添加到本地库),可通过git add进行追踪
1.3.4添加暂存区
将工作区的文件添加到暂存区
基本语法:
- 【git add 文件名】
- 如git add hello.txt,将hello.txt文件添加到暂存区
操作演示:可查看到新增了一个文件,但此时文件是存放到暂存区的,还可以删除
【git add】将文件从工作区放到暂存区,可被删除,使用命令
- 【git restore --staged 文件名】:将文件从暂存区撤销到工作区
- 示例:git restore --staged hello.txt
- 【git rm --caches 文件名】:删除暂存区文件
- 以上两个命令都可以实现删除暂存区文件,但此时磁盘文件还在,又变成未被追踪状态
1.3.5提交本地库
将暂存区的文件提交到本地库,提交后会形成历史版本,无法删除,除非删掉本地库,否则永久可查
基本语法:
- 【git commit -m “日志信息” 文件名】
- 示例:git commit -m “first commit首次提交” hello.txt
文件修改:
- 文件修改后,仍然使用【git add 文件名】的命令来将修改的文件再次添加暂存区,然后再通过【git commit】命令来提交到本地库
1.3.6查看历史版本
基本语法:
-
【git reflog】:查看版本信息
-
【git log】:查看版本详细信息,包括提交用户签名、完整版本号等
1.3.7版本穿梭
基本语法:
- 【git reset --hard 版本号】:可以通过版本号回到以前的版本,可先用【git reflog】获取版本号,再用此命令穿梭到想要的版本
Git切换版本,底层其实是移动的HEAD指针,通过版本穿梭可以改变指针指向
1.4Git分支
1.4.1分支介绍
在版本控制过程中,同时推进多个任务,为每个任务,我们就可以创建每个任务的单独分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来,开发自己分支的时候,不会影响主线分支的运行。分支可以简单理解成副本,一个分支就是一个单独的副本。(分支底层其实也是指针的作用)
好处:
- 同时并行推进多个功能开发,提高开发效率
- 各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败的分支删除重更新开始即可
1.4.2分支的操作
命令名称 | 作用 |
---|---|
git branch 分支名 | 创建分支 |
git branch -v | 查看分支 |
git checkout 分支名 | 切换分支 |
git merge 分支名 | 把指定的分支合并到当前分支上 |
1.4.2.1查看分支
命令:【git branch -v】,如下可查看到有master和dev两个分支
1.4.2.2切换分支
命令:【git checkout 分支名】,如下已经切换到dev分支
1.4.2.3合并分支
命令:【git merge 分支名】
合并时可能出现两种情况,正常合并和冲突合并:
-
正常合并:当前分支无修改,合并分支有修改,合并后当前分支内容修改为合并分支的内容
-
冲突合并:
- 冲突原因:合并分支时,两个分支在同一个文件的同一个位置有两套完全不同的修改。Git无法决定我们使用哪一个。必须人为决定新代码内容
- 合并时发生冲突后,打开文件手动修改文件内容,确定最终保存版本,并将多余的符号去掉
- <<<<<<HEAD:表示当前分支下修改的代码
- ==========:当前分支与合并分支代码之间的分隔符
- 》》》》》:合并分支的修改代码
- 上述修改后,再重新进行合并:
- 在当前分支下重新【git add 文件名】添加到暂存区,
- 然后再【git commit -m " "】提交到本地库,注意提交到本地库的时候不要加文件名,否则会报错
以上合并分支,只会修改当前的分支内容,不会修改被合并的分支内容
master、dev其实都是指向具体版本记录的指针。当前所在的分支,其实是由HEAD决定的,所以创建分支的本质就是多创建一个指针
- HEAD如果指向master,那么我们现在就在master分支上
- HEAD如果指向dev,那么我们现在就在dev分支上
所以切换分支的本质就是移动HEAD指针
1.5Git团队协作机制
Git团队写作机制分为两种:
- 团队内协作:团队成员使用同一个远程库,c成员clone到本地库后进行push、pull操作
- 跨团队协作:每一个团队一个远程库,通过fork来复制远程库,各团队在本地库进行push、pull操作,如果要更新远程库,则需要发送pull request申请,经远程库审核通过后,merge合并代
1.6IDEA集成Git
1.6.1环境准备
1.6.1.1Git配置忽略文件
配置忽略文件:将项目中其他非必要代码忽略,不需要Git进行管理,如.idea、target文件等。这些文件与项目的实际功能无关,不参与服务器上部署运行,把它们忽略掉能够屏蔽IDE工具之间的差异
配置步骤:
-
创建忽略规则文件xxxx.ignore(前缀名可以随便取,建议git.ignore)。这个文件的存放位置原则上哪里都行,但是为了便于让~/.gitconfig文件引用,建议也放在系统用户目录下
-
git.ignore文件模板内容如下
#编译文件 .class #日志文件 .log #BlueJ文件 .ctxt #Mobile Tools for Java(J2ME) .mtj.tmp/ #包文件 .jar .war .nar .ear .zip .tar.gz .rar .classpath .project .settings target .idea *.iml
-
在.gitconfig文件中引用忽略配置文件(此文件在Windows的系统用户目录下)
-
[user] name = chendan email = chen.dan37@byd.com [core] excludesfile = C:/Users/chendan/git.ignore #注意:这里要使用“正斜线(/)”,不要使用“反斜线(\)”
-
1.6.1.2定位Git程序
在IDEA里面要定位到git,需要打开IDEA-File-Settings-Version Control-Git,然后配置Git安装目录
以上,IDEA中的Git环境则配置完成了
1.6.2初始化&添加&提交
打开IDEA,在上端面板里面点击VCS-Create Git Repository,再选择当前项目,即当前项目可在IDEA中被Git管理,项目目录下生成.git目录,
上述Git管理后,项目中的文件则会变红,表示被Git追踪到,未添加暂存区
添加暂存区:右键-Git-Add,选中文件会变绿,表示加入到暂存区,但是还未提交到本地库
提交本地库:右键-Git-Commit,会看到暂存区里面的文件,写提交信息,然后commit,提交成功后,文件颜色会变成正常的黑色,表示已经提交到本地库
1.6.3切换版本
蓝色文件:表示被追踪过,但是有修改
- 可以重新添加暂存区,再提交本地库
- 但是因为已经追踪过,也可以直接提交本地库,不用再添加到暂存区
重新提交后会生成新版本,这时如何切换版本,在IDEA左下角Git中可以查看到不同版本信息,通过右键-checkout Revison '版本号’即可切换版本
1.6.4创建&切换分支
选择Git,在下拉框选择Create New Branch,弹出框里面填写分支名称
分支切换:右键点击checkout选项
1.6.5合并分支
在IDEA窗口的右下角,将dev分支合并到master分支中,右键-Merge into,如果代码没有冲突,分支直接合并成功,分支合并成功之后,代码自动提交,无需手动提交本地库
冲突合并:
master里面的hello.java修改、commit
dev里面的hello.java也修改,commit
然后进行合并,会弹出conflicts冲突框,然后就需要进行手动合并【左边是master代码,中间是确定合并的代码,右边是dev代码】,可以将中间框代码进行修改合并,修改完成后Apply,即合并成功,并自动提交了本地库
2.GitHub
GitHub网址:https://github.com/
2.1常用命令
远程仓库操作:
命令名称 | 作用 |
---|---|
git remote -v | 查看当前所有远程地址别名 |
git remote add 别名 远程地址 | 起别名 |
git push 别名 分支 | 推送本地分支上的内容到远程仓库 |
git pull 远程库地址别名 远程分支名 | 将远程仓库对于分支最新内容拉取下来后与当前本地分支直接合并 |
git clone 远程地址 | 将远程仓库的内容克隆到本地 |
clone克隆时不需要登录账号,直接用远程链接clone即可。clone后会做如下操作:
- 拉取代码
- 初始化本地仓库,本地目录会出现.git
- 创建别名,默认origin
2.2SSH免密登录
远程仓库Code Clone下面有http链接,还有SSH地址,我们也可以使用SSH进行访问,但是需要添加SSH key
具体操作如下:
- 进入系统当前用户目录,右键打开Git Bash命令行界面
- 运行命令生成.ssh密钥目录【注意:这里-C这个参数是大写C】
- 命令:【ssh-keygen -t rsa -C chen.dan37@byd.com】
- ssh-keygen:生成免密登录协议
- -t:指定用哪种算法来生成
- rsa:著名的非对称加密协议
- -C:一个描述,当前针对chen.dan37@byd.com邮箱进行免密登录
- 运行上述命令后敲三次回车键
- 命令:【ssh-keygen -t rsa -C chen.dan37@byd.com】
- 命令运行完成后,可在系统用户文件夹里面看到生成了.ssh文件夹,里面存放了id_rsa私钥和id_rsa.pub公钥
- 命令行进入.ssh目录里面,使用【cat id_rsa.pub】查看公钥内容
- 复制上面公钥的内容到GitHub里面,点开setting–SSH and GPG keys,添加SSH key,将公钥内容粘贴到里面,添加成功后就可以用【git pull SSH链接】来拉取代码
2.6IDEA集成GitHub
打开【IDEA-File-Settings-Version Control-GitHub】,IDEA默认包含GitHub这个插件的,如果在Version Control里面没找到,则在Plugins里面下载GitHub插件
-
设置GitHub账号:
使用Token登录,在【GitHub登录-Settings-Developer settings-Personal access token,在这里生成一个口令,出现一些选框进行权限设置,全部选满就行,然后生成口令,生成后找个txt文件保存起来,不然刷新就没有了,只显示一次。拿到口令后,到IDEA填入口令框,即创建好账号
-
分享项目到GitHub
【VCS-Import into Version Control-Share Project on GitHub】,不用在GitHub创建远程库,可以直接在IDEA中分享过去
-
push代码到远程库
git-push,默认push本地库中的commit,但是默认是使用https,https跟网络有关,很有可能push不成功,所以我们建议用SSH,在GitHub中复制SSH地址,然后在commit的时候右键自定义一个远程连接,将SSH地址填入URL,然后选中这个地址push即可
也可以在Git-Manage Remotes里面添加地址
注意:push是将本地库代码推送到远程库,如果本地库代码跟远程库代码版本不一致,push的操作是会被拒绝的。也就是说,要想push成功,一定要保证本地库的代码要比远程库的版本高!因此一个成熟的程序员在动手改本地代码之前,一定会先检查下远程库跟本地代码的区别!如果本地的代码版本已经落后,切记要先pull一下远程库的代码,将本地代码更新到最新以后,然后再修改,提交,推送!
-
pull远程库代码
git-pull
注意:pull是拉取远端仓库代码到本地,如果远程库代码和本地库代码不一致,会自动合并,如果自动合并失败,还会涉及到手动解决冲突的问题
-
clone克隆远程库代码到本地
VCS-Get from Version Control
3.Gitee码云
GitHub服务器在国外,使用GitHub作为项目托管网站,如果网速不好,严重影响使用体验,可能登录不上。因此,可以选择使用国内的项目托管网站-码云
码云是开源中国推出的基于Git的代码托管中心,使用方式跟GitHub一样,中文网站
官网:https://gitee.com/
3.1码云创建远程库
在登录界面里面:+新建仓库,填写仓库信息进行创建
因为码云是国内网站,所以https的访问链接是推荐的,同样也可以使用SSH免密登录,配置方法和GitHub一致
3.2IDEA集成Gitee码云
IDEA默认不带码云插件,首先要安装Gitee插件,在Plugins里面搜索安装,安装成功后在Verison Control里面就可以看到Gitee,即可添加Gitee账号
【很奇怪,我云桌面上没有安装Gitee插件和登录Gitee账号也可以使用,不知道为啥,安装Gitee后登录不上】
3.3码云连接GitHub进行代码的复制和迁移
在码云上面:+新建仓库,不用填仓库信息,界面拉到最下方有“导入已有仓库”,支持填入GitHub地址进行GitHub项目导入【注意:这里只能选择GitHub的https链接】,然后点击“创建”即可
如果需要更新Gitee上导入的GitHub代码,在项目名称旁边有一个更新按钮,点击后会强制同步GitHub上面的最新代码到Gitee中,感觉比较类似fork子仓库里面强制同步主远程仓库的代码
4.GitLab
GitLab是使用MIT许可证的基于网络的Git仓库管理工具,且具有wiki和issue跟踪功能。使用Git作为代码管理工具,并在此基础上搭建起来的web服务
官网地址:https://about.gitlab.com/
安装说明:https://about.gitlab.com/installation/
4.1GitLab服务器的搭建和部署
4.1.1服务器准备
准备一个系统为CentOS7以上版本的服务器,要求内存4G,磁盘50G
关闭防火墙,并且配置好主机名和IP,保证服务器可以上网
教程使用虚拟机:主机名:gitlab-server IP地址:192.168.6.200
4.1.2安装包准备
Yum在线安装gitlab-ce时,需要下载几百M的安装文件,非常耗时,所以最好提前把所需RPM包下载到本地,然后使用离线rpm的方式安装
下载地址:
https://package.gitlab.com/gitlab/gitlab-ce/packages/el/gitlab-ce-13.10.2-ce.0.ce17.x86_64.rpm
注:资料里提供了此rpm包,直接将此包上传到服务器/opt/module目录下即可
4.1.3编写安装脚本
安装gitlab步骤比较繁琐,因此我们可以参考官网编写gitlab的安装脚本
【vim gitlab-install.sh】,脚本编写完成后,wq保存
sudo rpm -ivh /opt/module/gitlab-ce-13.10.2-ce.0.ce17.x86_64.rpm
sudo yum install -y curl policycoreutiles-python openssh-server cronie
sudo lokkit -s http -s ssh
sudo yum install -y postfix
sudo service postfix start
sudo chkcontig postfix on
curl https://package.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
sudo EXTERANL_URL=*http://gitlab.example.com* yum -y install gitlab-ce
给脚本增加执行权限,输入下述命令后,再使用ll查看到脚本变绿,即可执行
chmod +x gitlab-install.sh
然后执行该脚本,开始安装gitlab-ce。注意一定要保证服务器可以上网,里面用到了yum安装,必须联网
./gitlab-install.sh
4.1.4GitLab服务初始化及启动
执行以下命令初始化GitLab服务,过程大概需要几分钟,耐心等待
gitlab-ctl reconfigure
执行以下命令启动GitLab服务
gitlab-ctl start
如需停止,执行gitlab-ctl stop
使用浏览器访问GitLab:使用主机名或者IP地址即可访问GitLab服务
在浏览器直接输入192.168.6.200访问,端口号默认80,这里是不用输入的
使用主机名访问:gitlab-server,需要提前配一下windoes的hosts文件
4.1.5GitLab登录
在浏览器登录GitLab
首次登录之前,需要修改下GitLab提供的root账户的密码,要求8位以上,包含大小写字母和特殊符号
然后使用修改后的密码登录GitLab
账号:root
密码:修改后的密码
然后即可开始创建远程库,创建过程与GitHub差不多,根据GitLab界面提示进行创建即可
4.2IDEA集成GitLab
首先,也是要安装GitLab插件,在Plugins里面下载,Apply后即可在Verison Control里面看到GitLab
添加GitLab连接
l reconfigure
执行以下命令启动GitLab服务
gitlab-ctl start
如需停止,执行gitlab-ctl stop
使用浏览器访问GitLab:使用主机名或者IP地址即可访问GitLab服务
在浏览器直接输入192.168.6.200访问,端口号默认80,这里是不用输入的
使用主机名访问:gitlab-server,需要提前配一下windoes的hosts文件
### 4.1.5GitLab登录
在浏览器登录GitLab
首次登录之前,需要修改下GitLab提供的root账户的密码,要求8位以上,包含大小写字母和特殊符号
然后使用修改后的密码登录GitLab
账号:root
密码:修改后的密码
然后即可开始创建远程库,创建过程与GitHub差不多,根据GitLab界面提示进行创建即可
## 4.2IDEA集成GitLab
首先,也是要安装GitLab插件,在Plugins里面下载,Apply后即可在Verison Control里面看到GitLab
添加GitLab连接
只要GitLab的远程库连接定义好以后,对GitLab远程库进行pull和clone的操作和GitHub以及码云一致,不再赘述