这是我的处女作,大家都多多关注,后面会更新互联专题系列: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安装包:下载地址
# 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
创作不易,但是我们从未有过有过放弃!!!