Git概述
Git是一个免费的、开源的分布式版本控制系统,可以快速高效地处理从小型到大型的各种项目;
Git 易于学习,占地面积小,性能极快。 它具有廉价的本地库,方便的暂存区域和多个工作 流分支等特性。其性能优于 Subversion、CVS、Perforce 和 ClearCase 等版本控制工具。
版本控制
版本控制是一种记录文件内容变化,以便将来查阅特定版本修订情况的系统。
版本控制其实最重要的是可以记录文件修改历史记录,从而让用户能够查看历史版本,方便版本切换。
版本控制工具
集中式版本控制工具
CVS、SVN(Subversion)、VSS……
集中化的版本控制系统诸如 CVS、SVN 等,都有一个单一的集中管理的服务器,保存 所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或提交更新。多年以来,这已成为版本控制系统的标准做法。
这种做法带来了许多好处,每个人都可以在一定程度上看到项目中的其他人正在做些什 么。而管理员也可以轻松掌控每个开发者的权限,并且管理一个集中化的版本控制系统,要远比在各个客户端上维护本地数据库来得轻松容易。
事分两面,有好有坏。这么做显而易见的缺点是中央服务器的单点故障。如果服务器宕 机一小时,那么在这一小时内,谁都无法提交更新,也就无法协同工作。
分布式版本控制工具
Git、Mercurial、Bazaar、Darcs……
像Git 这种分布式版本控制工具,客户端提取的不是最新版本的文件快照,而是把代码仓库完整地镜像下载下来(本地库)。这样任何一处协同工作用的文件发生故障,事后都可以用其他客户端的本地仓库进行恢复。因为每个客户端的每一次文件提取操作,实际上都是一次对整个文件仓库的完整备份。分布式的版本控制系统出现之后,解决了集中式版本控制系统的缺陷:
1. 服务器断网的情况下也可以进行开发(因为版本控制是在本地进行的)
2. 每个客户端保存的也都是整个完整的项目(包含历史记录,更加安全)
Git工作机制和代码托管中心
工作机制:
代码托管中心是基于网络服务器的远程代码仓库,一般我们简单称为远程库。
局域网:GitLab; 互联网:GitHub(外网)、Gitee码云(国内网站);
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 版本号 | 版本穿梭 |
设置用户签名
签名的作用是区分不同操作者身份。用户的签名信息在每一个版本的提交信息中能够看到,以此确认本次提交是谁做的。Git 首次安装必须设置一下用户签名,否则无法提交代码。
※注意:这里设置用户签名和将来登录 GitHub(或其他代码托管中心)的账号没有任何关系;
cat ~/.gitconfig
初始化本地库
在选定目录下右键点出git界面,输入命令git init
进行初始化界面,这个git就获取了这个目录的管理权,git就能获取这个目录的管理权。(初始化之后自动生成一个隐藏目录“.git”)
查看本地库状态
输入命令git status
查看首次创建的本地库(工作区无任何文件)
有文件的本地库
文件添加暂存区(又称为追踪)
命令git add 文件名
;
绿色表示git已经追踪它了(已经添加到暂存区了);
命令git rm --cached hello.txt
把暂存区文件删掉(工作区仍有),删掉之后如下;
将已经添加到暂存区的文件进行修改,然后再git status
查看其状态,发现如下:这时要
git add xxx
再次进行追踪;
文件提交本地库
命令git commit -m "日志信息" 文件名
;(日志信息又可以称为版本信息,自己随意写)
修改文件后再次添加到暂存区然后添加本地库:
查看历史纪录
命令git reflog
命令git log
:查看详细日志的命令;
版本穿梭
命令git reset --hard 版本号
用于在不同版本之间进行切换,切换后可以用cat
命令进行查看,会发现文件内容已变成切换后版本的内容;
git分支操作
什么是分支
在版本控制过程中,同时推进多个任务,为每个任务,我们就可以创建每个任务的单独分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来,开发自己分支的时候,不会影响主线分支的运行。对于初学者而言,分支可以简单理解为副本,一个分支就是一个单独的副本。(分支底层其实也是指针的引用)
分支的好处
同时并行推进多个功能开发,提高开发效率。
各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败的分支删除重新开始即可。
分支的操作
命令 | 操作 |
---|---|
git branch 分支名 | 创建分支 |
git branch -v | 查看分支 |
git checkout 分支名 | 切换分支 |
git merge 分支名 | 把指定的分支合并到当前分支上 |
查看分支
创建分支
切换分支
命令git checkout 分支名
执行命令后发现分支进行了切换。切换后不同分支在合并之前,对文件进行的操作互不影响;
合并分支
正常合并
命令git merge 分支名
:把“指定分支”合并到当前分支上;
意思就是用“指定分支”上已经更新的文件内容替换当前分支的文件内容(差不多就是内容覆盖的意思);
冲突合并
冲突产生的原因:合并分支时,两个分支在同一个文件的同一个位置有两套完全不同的修改。Git无法替我们决定使用哪一个。必须人为决定新代码内容。
例如:我有两个分支,一个master一个hot-fix,两个分支我都对同一文件进行了修改,然后添加到暂存区,然后上交本地库,然后我在一个分支之下合并另一个分支,就会出错(冲突),如下:
此时就需要手动合并了,具体操作:vim打开有冲突的那个文件,然后手动更改,把不需要的部分和那些“<<<、===、>>>”删掉,之后:wq
保存,保存之后,git add 文件名
添加本地库,之后git commit -m "版本信息"
(注意:此时不能带文件名)提交本地库;
合并只对当前分支的文件有影响,对合并的分支的文件无影响;
master、hot-fix 其实都是指向具体版本记录的指针。当前所在的分支,其实是由 HEAD 决定的。所以创建分支的本质就是多创建一个指针。
HEAD 如果指向 master,那么我们现在就在 master 分支上。
HEAD 如果执行 hotfix,那么我们现在就在 hotfix 分支上。
git团队协作机制
团队内协作&跨团队协作
GitHub操作
GitHub网站:https://github.com/
GitHub创建远程仓库
远程仓库操作
创建远程仓库别名
推送本地分支到远程仓库
命令:git push 远程仓库别名 分支名
:把此分支内所有代码提交到指定远程仓库;
之后刷新远程仓库就会发现提交的代码文件了。(本地库刷新远程库)
拉取远程库到本地库(更新本地库)
命令:git pull 远程库地址别名 远程分支名
;
(远程库刷新本地库)
克隆远程库到本地
命令:git clone 远程地址
小结:clone 会做如下操作。1、拉取代码。2、初始化本地仓库。3、创建别名(进入到克隆出来的以远程仓库名为名字文件夹内,git remote -v
可以发现已经自动为刚才克隆的远程地址起好了别名)
邀请加入团队(团队内协作)
拉取成功之后被邀请人就可以看到并且操作邀请人拉取自己所用的仓库了;
跨团队协作
SSH免密登录
公钥添加成功之后就可以用ssh地址免密进行push、pull等操作;
IDEA集成Git
1、配置Git忽略文件
原因:
idea、xxx.iml
这些文件与项目的实际功能无关,不参与服务器上部署运行。把它们忽略掉能够屏蔽 IDE 工具之间的差异。
操作:
创建忽略规则文件 xxxx.ignore(前缀名随便起,建议是 git.ignore)
这个文件的存放位置原则上在哪里都可以,为了便于让~/.gitconfig 文件引用,建议也放在用户家目录下(c盘用户名那个文件夹),文件内容如下:
Compiled class file
所有.class文件都不要
*.class
Log file
所有.log文件都不要,地下以此类推
*.log
BlueJ files
*.ctxt
Mobile Tools for Java (J2ME)
.mtj.tmp/
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
在.gitconfig 文件中引用忽略配置文件(此文件在 Windows 的家目录中)增添如下一句话:
[core] excludesfile = C:/Users/Administrator/git.ignore
2、IDEA定位Git程序
点击Test进行测试,也可能在git.exe路径栏下面显示版本号,不一定是弹窗;
3、初始化本地库
4、添加到暂存区
右键点击项目选择 Git -> Add 将项目添加到暂存区。
5、提交本地库
同添加到暂存区一样,选中项目,右键点击,剩下操作如下:
可以通过观察文件颜色判断,红色是未添加暂存区,绿色是添加暂存区未上传本地库,正常色是成功上传本地库;
6、切换代码版本
黄标签指的是当前页面在哪个版本;绿标签指的是当前标签右边的分支在哪个版本;
7、idea创建分支&切换分支
创建分支
切换分支
8、合并分支
正常合并
和上面一样,首先点右下角的分支图标:
(这里原分支hot-fix,合并分支为master)
冲突合并
IDEA集成GitHub
idea登陆GitHub账号
分享项目到GitHub
push 推送本地库到远程库
本地库代码新更新了一下东西,需要推送到远程库;
推送(push)的地方有很多,这只是其中一个;
pull拉取远程库到本地库
clone克隆远程库到本地
IDEA集成码云
idea登录码云账号
其余操作同GitHub
其余操作和GitHub一样,不过注意第一次push的时候创建新的gitee链接别名,然后pull和clone等操作的时候选择好链接别名;
码云导入GitHub项目
导入链接选用的是https协议的链接。
如果GitHub上面的项目更新了,gitee也可以一键同步:
自建代码托管平台-GitLab
GitLab 简介
GitLab 是由GitLabInc.开发,使用MIT许可证的基于网络的Git仓库管理工具,且具有wiki 和 issue 跟踪功能。使用Git作为代码管理工具,并在此基础上搭建起来的 web 服务。
GitLab 官网地址
官网地址:https://about.gitlab.com/
安装说明:https://about.gitlab.com/installation/
GitLab 安装
1、服务器准备
准备一个系统为 CentOS7 以上版本的服务器,要求内存4G,磁盘50G,关闭防火墙,并且配置好主机名和IP,保证服务器可以上网。并在opt目录下新创建一个目录module。
2、安装包准备
Yum 在线安装 gitlab- ce 时,需要下载几百 M 的安装文件,非常耗时,所以最好提前把所需 RPM 包下载到本地,然后使用离线 rpm 的方式安装。
这个安装文件:gitlab-ce-13.10.2-ce.0.el7.x86_64.rpm
将这个安装包传输到/opt/moudle/
目录下;
3、编写安装脚本
安装 gitlab 步骤比较繁琐,因此我们可以参考官网编写 gitlab 的安装脚本。
首先使用命令在module目录下创建编辑一个配置文件:vim gitlab-install.sh
然后文件编辑如下内容:
sudo rpm -ivh /opt/module/gitlab-ce-13.10.2-ce.0.el7.x86_64.rpm sudo yum install -y curl policycoreutils-python openssh-server cronie sudo lokkit -s http -s ssh sudo yum install -y postfix sudo service postfix start sudo chkconfig postfix on curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash sudo EXTERNAL_URL=”http://gitlab.example.com” yum -y install gitlab-ce
保存之后,使用命令给脚本增加执行权限:chmod +x gitlab-install.sh
最后执行这个脚本文件./gitlab-install.sh
直至出现以下画面:
4、初始化Gitlab服务
执行命令gitlab-ctl reconfigure
;
直至出现如下画面:
5、启动和关闭 GitLab 服务
启动命令:gitlab-ctl start
关闭命令:gitlab-ctl stop
6、登录GitLab
之后浏览器地址栏直接输入服务器ip就可以访问
设置一个密码,账号名默认是root;登陆进去之后new project创建一个库;
IDEA集成GitLab
1、安装GitLab插件:
2、Idea登陆GitLap:
首次向连接 gitlab,需要登录帐号和密码,用 root 帐号和我们修改的密码登录即可。
只要 GitLab 的远程库连接定义好以后,对 GitLab 远程库进行 pull 和 clone 的操作和
Github 和码云一致,此处不再赘述。