yaochow@home:~$

【介绍】Git

GIT&SVN

主要区别

  1. 存储方式不同
  2. 使用方式不同
  3. 管理模式不同

存储方式

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是一个非标准端口,一般防火墙不会开放。