哇晒,GIT原来是这么强大,还可以这样使用!你们知道吗?

     这是我的处女作,大家都多多关注,后面会更新互联专题系列:GIT,MAVEN,LINUX,JENKINS,DOCKOER,K8S等,并发专题,源码专题,微服务专题,分布式专题,性能调优专题及面试专题等,更新进度的话大概10天左右会更新一篇文章,欢迎大家关注,我们一起进步一起学习。

互联网专题-GIT版本控制思维导图

1、GIT的安装

     官方客户端下载地址: 下载地址

1.1、Windows与Mac安装Git

     由于太简单,这几就不介绍了(一直下一步就OK),我就贴篇别人写的吧:Window安装Git教程Mac安装Git教程;如果遇到很奇怪问题,导致我们可以一起讨论一下,相互学习。

1.2、Linux安装Git

     下载Linux安装包:下载地址
GIT下载位置

# 1、升级所有包同时也升级软件和系统内核
yum update
# 2、检测GIT是否有安装
git --version
# 3、如果版本过低,先卸载
yum remove git
# 4、安装依赖环境(注意这个步骤可能会安装git,执行完这里需要执行一下2,3步)
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker
# 5、把GIT包上传到Linux的/home目录下(推荐一个工具,finalshell),然后解压
tar -zxvf git-2.32.0.tar.gz 
# 6、进入git-2.32.0目录
cd git-2.32.0
# 7、编译
make prefix=/usr/local/git all
# 8、安装
make prefix=/usr/local/git install
# 9、配置环境变量
# 9.1、编辑配置文件
vi /etc/profile
# 9.2、末尾添加此语句
export PATH=/usr/local/git/bin:$PATH
# 9.3、立即生效修改的配置环境
source /etc/profile
# 10、最后就是检测
git --version
如果出现下面语句,则就表示安装成功
git version 2.30.0

2、GIT和SVN的区别

2.1、存储方式

     GIT把内容按元数据方式存储类似k/v数据库
在这里插入图片描述

# 找出这个文件的hash编码,这个hash值就是key
git hash-object -w ceshi.txt
# 然后通过key去获取数据
git cat-file -p ab296fa1cd295005767a38131925e27b3f16b1d5

     SVN是按文件存储

2.2、使用方式

     从本地把文件推送远程服务,GIT需要 add、commint、push 三个步骤。
在这里插入图片描述

     从本地把文件推送远程服务,SVN只需要commint
在这里插入图片描述

2.3、管理模式

     GIT 是一个分布式的版本管理系统,例如:一个项目可以有多个远程仓库。
在这里插入图片描述
     SVN远程集中式的管理系统,只有一个远程仓库
在这里插入图片描述


3、GIT的基本操作命令

3.1、初始化项目

# 初始化
git init <fileName>
# 初始化基础(生成.git)
git init -bare ceshi.git

3.2、添加到缓存区

# 添加指定文件至暂存区
git add <fileName>
# 添加指定目录至暂存区
git add <directory>
# 添加所有
git add -A
# 将指定目录及子目录移除出暂存区
git rm --cached target

3.3、提交到本地仓库

# 提交至本地仓库
git commit file -m '提交评论'
# 快捷提交至本地仓库
git commit -am '快添加与提交'

3.4、远程仓库配置

# 查看远程配置 
git remote [-v]
# 添加远程地址
git remote add origin http:xxx.xxx
# 删除远程地址
git remote remove origin 

3.5、推送到远程仓库

# 上传远程仓库
git push origin master
# 将本地分支与远程建立关联
git branch --track --set-upstream-to=origin/test test

3.6、克隆项目

# 克隆项目(可以重新命名)
git clone <remote_url> [targetName]

3.7、拉取远程项目更新本地

git pull <remote_name> <branch name>

3.8、分支管理

# 查看当前分支
git branch [-avv]
# 基于当前分支新建分支
git branch <branch name>
# 基于提交新建分支
git branch <branch name> <commit id>
# 删除分支
git branch -d {branch name}
# 切换分支
git checkout <branch name>
# 合并分支
git merge <merge target>
# 解决冲突,如果因冲突导致自动合并失败,此时 status 为mergeing 状态.
# 需要手动修改后重新提交(commit)

3.9、标签管理

# 查看当前
git tag
# 创建标签
git tag <tag name> <branch name>
# 删除标签
git tag -d <tag name>

3.10、日志管理

# 查看当前分支下所有提交日志
git log
# 查看当前分支下所有提交日志
git log {branch}
# 单行显示日志
git log --oneline
# 比较两个版本的区别
git log master..experiment
#以图表的方式显示提交合并网络
git log --pretty=format:'%h %s' --graph

4、GIT的底层原理

4.1、GIT存储对象

      Git 是一个内容寻址文件系统,其核心部分是一个简单的键值对数据库(key-value data store),你可以向数据库中插入任意内容,它会返回一个用于取回该值的hash 键。
演示一下:

# git 键值库中插入数据
echo 'ceshi' | git hash-object -w --stdin
ab296fa1cd295005767a38131925e27b3f16b1d5

#基于键获取指定内容
git cat-file -p ab296fa1cd295005767a38131925e27b3f16b1d5
#Git基于该功能 把每个文件的版本中内容都保存在数据库中,当要进行版本回滚的时候就通过其中一个键将期取回并替换。
# 模拟演示git 版写入与回滚过程
# 查找所有的git 对像
find .git/objects/ -type f
# 写入版本1
echo 'ceshi1' > ceshi.txt; git hash-object -w ceshi.txt;
# 写入版本2
echo 'ceshi2' > ceshi.txt; git hash-object -w ceshi.txt;
# 写入版本3
echo 'ceshi3' > ceshi.txt; git hash-object -w ceshi.txt;
# 回滚指定版本
git cat-file -p c13725173a7b51197f775c038ae59c11ca753ec6 > ceshi.txt

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

      我们解决了存储的问题,但其只能存储内容同并没有存储文件名,如果要进行回滚 怎么知道哪个内容对应哪个文件呢?接下要讲的就是树对象,就是用来解决这个问题的。

4.2、GIT树对象

      树对像解决了文件名的问题,它的目的将多个文件名组织在一起,其内包含多个文件名称与其对应的Key和其它树对像的用引用,可以理解成操作系统当中的文件夹,一个文件夹包含多个文件和多个其它文件夹。
在这里插入图片描述
演示一下:

# 初始化仓库
git init ceshi

# 进入仓库
cd ceshi

# 往仓库里面添加文件
echo "ceshi" > ceshi.txt

# 查看仓库中是否存在内容
find .git/objects/ -type f

# 添加ceshi.txt到暂存区
git add -A

# 查看仓库中是否存在内容
find .git/objects/ -type f
.git/objects//ab/296fa1cd295005767a38131925e27b3f16b1d5

# 提交到本地仓库
git commit -am "1 commit"

# 查看仓库中是否存在对象
$ find .git/objects/ -type f
.git/objects//ab/296fa1cd295005767a38131925e27b3f16b1d5
.git/objects//a9/1a4110612b8bf809319f043bf188e9e7ff81b3
.git/objects//8b/06cda81ef6ba897f1e4f44315541e6840148a2

# 查看仓库中的树对象
git cat-file -p master^{tree}

# 创建目录
mkdir -p com/ceshidir/

# 创建hello.txt文件
echo "ceshi2" > com/ceshidir/hello.txt

# 提交文件到暂存区
git add -A

# 查看仓库中的对象
find .git/objects/ -type f
.git/objects//ab/296fa1cd295005767a38131925e27b3f16b1d5
.git/objects//a9/1a4110612b8bf809319f043bf188e9e7ff81b3
.git/objects//e7/7dbee08f78f9382cc18ddd88e40489856e5e41
.git/objects//8b/06cda81ef6ba897f1e4f44315541e6840148a2

# 提交代码到本地仓库
git commit -m "2 commit "

# 查看仓库中的对象
find .git/objects/ -type f
.git/objects//b4/9527ea0435fdf9553df90b3029178d8ad49aca
.git/objects//ab/296fa1cd295005767a38131925e27b3f16b1d5
.git/objects//fd/02d7b190eece7d3ec31d6762b56f962c93bd89
.git/objects//8a/48a6fb339db291d7564c7562e75a9f8d18e88d
.git/objects//a9/1a4110612b8bf809319f043bf188e9e7ff81b3
.git/objects//e7/7dbee08f78f9382cc18ddd88e40489856e5e41
.git/objects//8b/06cda81ef6ba897f1e4f44315541e6840148a2
.git/objects//25/4155b4933728a31ef4da4fe8314a77d70d10cc

# 查看仓库中的树对象
git cat-file -p master^{tree}
100644 blob ab296fa1cd295005767a38131925e27b3f16b1d5	ceshi.txt
040000 tree fd02d7b190eece7d3ec31d6762b56f962c93bd89	com

4.3、GIT提交对象

      一次提交即为当前版本的一个快照,该快照就是通过提交对像保存,其存储的内容为:一个顶级树对象、上一次提交的对像啥希、提交者用户名及邮箱、提交时间戳、提交评论。
演示一下:

# 查看提交历史记录
$ git log
commit 254155b4933728a31ef4da4fe8314a77d70d10cc (HEAD -> master)
Author: wtyicy <2713855352@qq.com>
Date:   Fri Jun 25 08:20:26 2021 +0800

    2 commit

commit a91a4110612b8bf809319f043bf188e9e7ff81b3
Author: wtyicy <2713855352@qq.com>
Date:   Fri Jun 25 08:16:37 2021 +0800

    1 commit
# 查看提交对象
git cat-file -p 254155b4933728a31ef4da4fe8314a77d70d10cc
tree 8a48a6fb339db291d7564c7562e75a9f8d18e88d
parent a91a4110612b8bf809319f043bf188e9e7ff81b3
author wtyicy <2713855352@qq.com> 1624580426 +0800
committer wtyicy <2713855352@qq.com> 1624580426 +0800

2 commit

总结: 通过上面的知识,我们可以推测出从修改一个文件到提交的过程总共生成了三个对像:
      一个内容对象 ==> 存储了文件内容
      一个树对像 ==> 存储了文件名及内容对像的key
      一个提交对像 ==> 存储了树对像的key 及提交评论

4.4、GIT引用对象

      当我们执行 git branch {branchName} 时创建了一个分支,其本质就是在git 基于指定提交创建了一个引用文件,保存在 .git\refs\heads\ 下。
演示一下:

# 创建分支
git branch test master

# 指向test分支指向Master
cat .git/refs/heads/test
e54db44588be5541e5b3f3625bfae1a4a49707d5

# 主分支
cat .git/refs/heads/master
e54db44588be5541e5b3f3625bfae1a4a49707d5

git 总共 有三种类型的引用:
      分支引用
      远程分支引用
      标签引用


5、GIT的网络协议

5.1、Local(本地协议)

基于本地文件系统或共享(NFS)文件系统进行访问,
      优点:简单,直接使用了现有的文件权限和网络访问权限,小团队小项目建立一个这样的版本管理系统是非常轻松的一件事。
      缺点:这种协议缺陷就是本身共享文件系统的局限,只能在局域网,而且速度也慢。
      适应场景:小团队,小项目临时搭建版本服务。
演示:

# 初始化仓库
$ git init --bare ceshi.git
Initialized empty Git repository in /Users/wtyicy/Desktop/ceshi.git/

# 直接复制文件clone项目
$ git clone /Users/wtyicy/Desktop/ceshi.git

# 通过文件协议clone项目
$ git clone file:///Users/wtyicy/Desktop/ceshi ceshi2

使用复制文件方式clone:
在这里插入图片描述
使用文件协议方式clone:
在这里插入图片描述

5.2、SSH协议

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

# 本机操作:本地生成SSH公钥和私钥,然后复制公钥到服务器.ssh
ssh-keygen -t rsa

# 服务器:创建项目
git init --bare ceshi.git

# 本机操作:clone项目
git clone root@192.168.18.103:/home/ceshi.git

# 可能的错误:
git-upload-pack: command not found
# 原因是 ssh 协议下只能访问/usr/bin 下的目录,解决办法如下(服务器执行下面两个命令):
ln -s /usr/local/git/bin/git-upload-pack /usr/bin/git-upload-pack
ln -s /usr/local/git/bin/git-receive-pack /usr/bin/git-receive-pack

5.3、HTTP协议

      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 与ssh 是很难做到这一点,必如实现一个类似github 这样的网站。
      缺点:架设复杂一些需要部署 WEB服务器,和https 证书之类的配置
      场景:大型团队、需要对权限精准控制、需要把服务部署到公网上去
演示一下:

# 1、创建服务端版本仓库
git init --bare ceshi.git
# 2、进入nginx配置目录,并编辑nginx.conf
cd /home/nginx/conf
vi nginx.conf
# 3、nginx 静态访问配置
server {
        listen       80;
        server_name  git.tl.com;
        location / {
            root  /home/git;
        }
}
# 3、重启nginx
.nginx -t
.nginx -s reload
# 3、重命名钩子 
mv hooks/post-update.sample hooks/post-update

# 4、本地克隆远程服务
git clone http://{IP}:{port}/ceshi.git

      注:http Smart 协议 是基于 CGI 配合GIT git-http-backend 脚本进行使用,配置较复杂,现在一般不会这么去做,而是采用gitlab 、gogs 之类的web管理进行代替,在此就不在演示。

5.4、GIT协议

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

# 创建项目
git init --bare ceshi.git
# 进入项目
cd ceshi.git/
# 创建一个空文件,表示开放该项目
touch git-daemon-export-ok
# 启动守护进程
$nohub git daemon --reuseaddr --base-path=/home/git /home/git/ &
#本地克隆远程项目
git clone git://192.168.0.147:9418/ceshi.git

6、GOGS的安装和使用

6.1、GOGS的介绍和安装

6.1.1、GOGS的介绍

      Gogs 是一款开源的轻量级Git web服务,其特点是简单易用完档齐全、国际化做的相当不错。其主要功能如下:
      1、提供Http 与ssh 两种协议访问源码服务
      2、提供可WEB界面可查看修改源码代码
      3、提供较完善的权限管理功能、其中包括组织、团队、个人等仓库权限
      4、提供简单的项目viki功能
      5、提供工单管理与里程碑管理。
      gitlab和gogs的区别?
      gitlab安装和配置比较复杂,但是功能比较强大,gogs的安装简单,适合小公司使用。

6.1.2、GOGS的安装

下载安装
      官网:https://gogs.io
      下载:https://gogs.io/docs/installation 选择 linx amd64 下载安装
      文档:https://gogs.io/docs/installation/install_from_binary
1、安装,解压之后目录:
在这里插入图片描述
2、运行

# 前台运行
./gogs web
# 后台运行
$nohup ./gogs web &
# 默认端口:3000
# 初次访问http://<host>:3000 会进到初始化页,进行引导配置。
# 可选择mysql 或sqlite 等数据。这里选的是sqllite
# 注:mysql 索引长度的问题没有安装成功,需要用mysql5.7 以上版本

6.2、GOGS的基本配置

      邮件配置说明:邮件配置是用于注册时邮件确认,和找回密码时候的验证邮件发送。其配置分为两步:
      第一:创建一个开通了smtp 服务的邮箱帐号,一般用公司管理员邮箱,我这里用的是QQ邮箱。
      QQ邮箱开通smtp服务
      1、点击设置
在这里插入图片描述
      2、开启smtp
在这里插入图片描述
      第二:在{gogs_home/custom/conf/app.ini 文件中配置。
在这里插入图片描述

ENABLED =true 表示启用邮件服务
host 为smtp 服务器地址,(需要对应邮箱开通smtp服务 且必须为ssl 的形式访问)
from 发送人名称地址
user 发送帐号
passwd 开通smtp 帐户时会有对应的授权码

重启后可直接测试
管理员登录==》控制面版==》应用配置管理==》邮件配置==》发送测试邮件

6.3、GOGS的定时备份和恢复

备份和恢复步骤:

# 查看备份相关参数
./gogs backup -h
# 默认备份,备份在当前目录
./gogs backup 
# 参数化备份  --target 输出目录 --database-only 只备份 db 
./gogs backup --target=./backupes --database-only --exclude-repos
# 恢复。执行该命令前要先删除 custom.bak
./gogs restore --from=gogs-backup-20210627062712.zip

备份脚本:

# 自动备份脚本
# !/bin/sh -e
gogs_home="/home/apps/svr/gogs/"
backup_dir="$gogs_home/backups"

cd `dirname $0`
# 执行备份命令
./gogs backup --target=$backup_dir

echo 'backup sucess'
day=7
# 查找并删除 7天前的备份  
find $backup_dir -name '*.zip' -mtime +7 -type f |xargs rm -f;
echo 'delete expire back data!'
#添加定时任务 每天4:00执行备份
# 打开任务编辑器
crontab -e
# 输入如下命令 00 04 * * * 每天凌晨4点执行 do-backup.sh 并输出日志至 #backup.log
00 04 * * * /home/apps/svr/gogs/do-backup.sh >> /home/apps/svr/gogs/backup.log 2>&1

创作不易,但是我们从未有过有过放弃!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值