Git

GIT体系概述
Git和SVN的区别
  • 存储方式不一样
    Git将内容按元数据方式存储类似k/v数据库,而SVN是按文件(新版SVN已改成元数据存储)
  • 使用方式不一样
    从本地把文件推送远程服务,SVN只需要commit而Git需要add、commit、push三个步骤。

Git基本使用过程

  • 管理方式不一样
    Git是一个分布式的版本管理系统,而SVN是一个远程集中式的管理系统
Git核心命令使用
  • 本地初始化Git仓库:git clone <远程仓库地址>

  • 当前目录初始化为git本地仓库:git init (git init --bare初始化为裸仓库)

  • 基于mvn模板创建项目:mvn archetype:generate

  • 添加指定文件至暂存区:git add <文件名>

  • 添加所有文件至暂存区:git add -a

  • 将指定目录及子目录移除出暂存区:git rm --cached target -r

  • 提交至本地仓库:git commit file -m “提交信息”

  • 快捷提交至本地仓库:git commit -am “提交信息”

  • 查看当前分支:git branch [-avv]

  • 基于当前分支新建分支:git branch <分支名称>

  • 基于提交新建分支:git branch <分支名称> <提交id>

  • 删除本地分支: git branch -d <分支名称>(-d删除,-D强制删除)

  • 切换分支:git checkout <分支名称>

  • 合并分支:git merge <合并到的分支目标>
    解决冲突,如果因冲突导致自动合并失败,此时status为mergeing状态,需要手动修改后重新提交。

  • 查看远程配置;git remote [-v]

  • 添加远程地址:git remote add origin <远程地址>

  • 删除远程地址: git remote remove origin

  • 上传新分支至远程:git push --set-upstream origin master

  • 将本地分支与远程分支建立关联:git branch --track --set-upstream-to=origin/test test

  • 查看当前tag分支:git tag(tag只读分支)

  • 创建tag分支: git tag <分支名称>

  • 删除tag分支:git tag -d

  • 查看当前分支下所有提交日志:git log

  • 查看当前分支下所有提交日志:git log {分支名称}

  • 单行显示日志:git log --oneline

  • 比较两个版本的区别:git log master…experiment

  • 以图表的形式显示提交合并网络:git log --pretty=format:’%h %s’ --graph

Git底层原理
Git存储对象
  • Git是一个内容寻址文件系统,其核心部分是一个简单的键值对数据库(key-value data store),你可以向数据库中插入任意内容,它会返回一个用于取回该值的hash键。
  • git键值库中插入数据:echo ‘luban is good man’ | git hash-object -w --stdin 79362d07cf264f8078b489a47132afbc73f87b9a
  • 基于键获取指定内容:git cat-file -p 79362d07cf264f8078b489a47132afbc73f87b9a
  • Git基于该功能把每个文件的版本中内容都保存在数据库中,当要进行版本回滚的时候就通过其中一个键将其取回并替换。
模拟演示git 版写入与回滚过程
# 查找所有的git 对像
  find .git/objects/ -type f
# 写入版本1
echo 'version1' > README.MF; git hash-object -w README.MF;
# 写入版本2
echo 'version2' > README.MF; git hash-object -w README.MF;
# 写入版本3
echo 'version3' > README.MF; git hash-object -w README.MF;
# 回滚指定版本
git cat-file -p c11e96db44f7f3bc4c608aa7d7cd9ba4ab25066e > README.MF

所以我们平常用的 git add 其实就是把修改之后的内容 插入到键值库中。当我们执行 git add README.MF 等同于执行了 git hash-object -w README.MF 把文件写到数据库中。

Git树对象
  • 树对象解决了文件名的问题,它的目的将多个文件名组织在一起,其内包含多个文件名称与其对应的Key和其它树对象的引用,可以理解成操作系统当中的文件夹,一个文件夹包含多个文件和多个其它文件夹。
  • 在这里插入图片描述
  • 每一个分支当中都关联了一个树对象,它存储了当前分支下所有的文件名及对应的key。
  • 查看分支树: git cat-file -p master^{tree}
Git提交对象

一次提交即为当前版本的一个快照,该快照就是通过提交对象保存,其存储的内容为:一个顶级树对象、上一次提交的对象hash、提交者用户名及邮箱、提交时间戳、提交评论。
从修改一个文件到提交的过程总共生成了三个文件

  • 一个内容对象==》存储了文件内容
  • 一个树对象 ==》存储了文件名及内容对象的key
  • 一个提交对象 ==》存储了树对象的key及提交评论
Git引用
  • 当我们执行 git branch {branchName} 时创建了一个分支,其本质就是在git 基于指定提交创建了一个引用文件,保存在 .git\refs\heads\ 下。
  • Git总共有三种类型的引用:分支引用、远程分支引用、标签引用
Git私服搭建
Git的四种通信协议
  • local(本地协议):基于本地文件系统或共享(NFS)文件系统进行访问。适用于小团队,小项目临时搭建版本服务。
    优点:简单,直接使用了现有的文件权限和网络访问权限,小团队小项目建立一个这样的版本管理系统是非常轻松的一件事。
    缺点:这种协议缺陷就是本身共享文件系统的局限,只能在局域网,而且速度也慢。

  • ssh协议:git支持利用ssh协议进行通信,这是绝大部分linux、uninx系统都支持的,所以利用该协议架设GIT版本服务是非常方便的。适用于小团队、小项目、临时项目
    优点:SSH架构设计相对简单、其次通过SSH访问是安全的、另外SSH协议很高效,在传输前也会尽量压缩数据。
    缺点:权限体系不灵活,必须提供操作系统的账户密码,哪怕是只需要读取版本。

  • http(Dumb、Smart):Git http协议实现是依赖WEB容器(Apache,Nginx)及cgi组件进行通信交互,并利用WEB容器本身权限体系进行授权认证。在 Git 1.6.6 前只支持http Dumb(哑)协议,该协议只能下载不能提交,通常会配合ssh 协议一起使用,ssh 分配提交帐号,http dumb提供只读帐号。1.6.6 之后git 提供了git-http-backend 的 CGI 用于实现接收远程推送等功能。适用于大型团队、需要对权限精准控制、需要把服务部署到公网上去。
    优点:解决了local和ssh权限认证单一的问题、可基于http url提供匿名服务,从而可以放到公网上去。而local与shh很难做到这一点,比如实现一个类似于GitHub这样的网站。
    缺点:架构复杂一些需要部署WEB服务器,和http证书之类的配置。
    http Smart 协议 是基于 CGI 配合GIT git-http-backend 脚本进行使用,配置较复杂,现在一般不会这么去做,而是采用gitlab 、gogs 之类的web管理进行代替。

  • GIT协议
    Git协议是包含在Git里的一个特殊的守护进程;它监听在一个特定的端口(9418),类似于SSH服务,但是访问无需任何授权。
    优点:目前,Git 协议是 Git 使用的网络传输协议里最快的。 如果你的项目有很大的访问量,或者你的项目很庞大并且不需要进行用户授权,架设 Git 守护进程来提供服务是不错的选择。 它使用与 SSH 相同的数据传输机制,但是省去了加密和授权的开销。
    缺点:Git的缺点是缺乏授权机制。而且9418是一个非标志端口,一般防火墙不会开放

基于gogs快速搭建企业私有Git服务

Gogs是一款开源的轻量级Git web服务,特点是简单易用文档齐全、国际化做的相当不错。主要功能如下:

  • 提供Http与ssh两种协议访问源码服务
  • 提供可视化界面可查看修改源码代码
  • 提供比较完善的权限管理功能、其中包括组织、团队、个人等仓库权限。
  • 提供简单的项目VIKI功能
  • 提供工单管理和里程碑管理

运行:默认端口3000

  • 前台运行:./gogs web
  • 后台运行:$nohup ./gogs web &
  • 初次访问http://:3000 会进行到初始化页,进行引导配置。可以选择MySQL或sqlite等数据。(MySQL索引长度的问题没有安装成功,需要使用MySQL5.7以上版本)
  • gitlab也可以搭建不过gitlab的安装比较重
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jzs1064

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值