【介绍】Git
GIT&SVN
主要区别
- 存储方式不同
- 使用方式不同
- 管理模式不同
存储方式
GIT将内容按元数据方式存储类似KV数据库
SVN是按文件(新版本SVN已改成元数据存储)
使用方式
从本地将文件推送远程服务,SVN只需要COMMIT而GIT需要ADD、COMMIT、PUSH三个步骤
版本管理模式
GIT是一个分布式的版本管理系统,而SVN是一个远程集中式的管理系统
GIT命令
- 创建项目
- 初始化GIT仓库
- 提交文件
- 远程关联
- PUSH至远程仓库
本地初始化GIT仓库
基于远程仓库克隆至本地:git clone <remote_url>
当前目录初始化未GIT本地仓库:git init <directory>
基于MAVEN模版创建项目:mvn archetype:generate
本地添加
添加制定文件至暂存区:git add <fileName>
添加指定目录至暂存区:git add <directory>
添加所有: git add -A
将指定目录及子目录移除出暂存区:git rm —cached target -r
添加忽略配置文件:.gitignore
本地提交
提交至本地仓库:git commit file -m ‘提交评论’
快捷提交至本地仓库:git commit -am ‘快添加与提交’
分支管理
查看当前分支:git branch [-avv]
基于当前分支新建分支:git branch <branch name>
基于提交新建分支:git branch <branch name> <commit id>
切换分支:git checkout <branch name>
合并分支:git merge <merge target>
解决冲突,如果因冲突导致自动合并失败,此时status为mergeing状态,需要手动修改后重新提交。
远程仓库管理
查看远程配置:git remote [-v]
添加远程地址:git remote add origin http://xxx.xxx
删除远程地址:git remote remove origin
上传新分支至远程:git push –set-upstream origin master
将本地分支与远程建立关联:git branch –track –set-upstream-to=origin/test test
TAG管理
查看当前:git tag
创建分支:git tag <tag name> <branch name>
删除分支:git tag -d <tag name>
日志管理
查看当前分支下所有提交日志:git log
查看当前分支下所有提交日志:git log {branch}
单行显示日志:git log –oneline
比较两个版本的区别:git log master..experiment
以图表的方式显示提交合并网络:git log –pretty=format:%h%s’ –graph
GIT底层原理
- GIT存储对象
- GIT树对象
- GIT提交对象
- GIT引用
GIT存储对象(hashMap)
GIT是一个内容寻址文件系统,其核心部分是一个简单的健值对数据库(key-value data store),你可以向数据库中插入任意内容,它会返回一个用于取回该值的hash键。
GIT树对象
树对象解决了文件名的问题,它的目的将多个文件名组织在一起,其内包含多个文件名称与其对应的KEY和其它树对象的引用,可以理解成操作系统当中的文件夹,一个文件夹包含多个文件和多个其它文件夹。
每一个分支当中都关联了一个树对象,它存储了当前分支下所有的文件名及对应的KEY。
GIT提交对象
一次提交即为当前版本的一个快照,该快照就是通过提交对象保存,其存储的内容为:一个顶级树对象、上一次提交的对象哈希、提交者用户名及邮箱、提交时间戳、提交评论。
通过上面的知识,我们可以推测出从修改一个文件到提交的过程总过生成了三个对象:
- 一个内容对象—>存储了文件内容
- 一个树对象—>存储了文件名及内容对象的KEY
- 一个提交对象—>存储了树对象的KEY及提交评论。
GIT引用
当我们执行 git branch {branchName}时创建了一个分支,其本质就是在GIT基于制定提交创建了一个引用文件,保存在.git\refs\heads\下。
GIT总共有三种类型的引用:
- 分支引用
- 远程分支引用
- 标签引用
GIT服务器搭建方式
GIT是一个分布式版本管理系统,既然是分布那么必定会涉及远程通信,那么GIT是采用什么协议进行远程通信呃呢?
GIT支持的四种通信协议:
- Local(本地协议)
- ssh
- http(Dumb、Smart)
- git
Local(本地协议)
基于本地文件系统或共享(NFS)文件系统进行访问。
- 优点:简单,直接使用了现有的文件权限和网络访问权限,小团队小项目建立一个这样的版本管理系统是非常轻松的一件事儿。
- 缺点:这种协议缺陷就是本身共享文件系统的局限,只能在局域网,而且速度也慢。
- 适应场景:小团队,小项目临时搭建版本服务。
ssh协议
GIT支持利用ssh协议进行通信,这是绝大部分linux、uninx系统都支持的,所以利用该协议假设GIT版本服务是非常方便的。
- 优点:首先SSH架设相对简单、其次通过SSH访问是安全的、另外SSH协议很高效,在传输前也会尽量压缩数据。
- 缺点:权限体系不灵活,必须提供操作系统的账户密码,哪怕只需要读取版本。
- 适应场景:小团队、小项目、临时项目
http(Dumb、Smart)
GIT http协议实现是依赖WEB容器(apache、nginx)及cgi组件进行通信交互,并利用WEB容器本身权限体系进行授权验证。
在GIT1.6.6前只支持http Dumb协议,该协议只能下载不能提交,通常会配合ssh协议一起使用,ssh分配提交账号,http dumb提供只读账号。1.6.6之后git提供了git-http-backend的CGI用于实现接收远程推送等功能。
- 优点:解决了local与ssh权限验证单一的问题、可基于http url提供匿名服务,从而可以放到公网上去。而local与ssh很难做到这一点,必须实现一个类似github这样的网站。
- 缺点:架设复杂一些,需要部署WEB服务器,和https证书之类的配置。
- 场景:大型团队、需要对权限精准控制、需要把服务部署到公网上去。
http Smart协议是基于CGI配合GIT git-http-backend脚本进行使用,配置较复杂,现在一般不会这么去做,而是采用gitlab、gogs之类的web管理进行代替。
GIT协议
GIT协议是包含在GIT里的一个特殊的守护进程;它监听在一个特定的端口(9418),类似于SSH服务,但是访问无需任何授权。
- 优点:GIT协议是GIT使用的网络传输协议里最快的。如果你的项目有很大的访问量,或者你的项目很庞大并且不需要为写进行用户授权,架设GIT守护进程来提供服务是不错的选择。它使用与ssh相同的数据传输机制,但是省去了加密和授权的开销。
- 缺点:GIT协议缺点是缺乏授权机制。而且9418是一个非标准端口,一般防火墙不会开放。