Git版本控制工具
一、Git的介绍
介绍
Git是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。分布式相比于集中式的最大区别在于开发者可以提交到本地,每个开发者通过克隆,在本地机器上拷贝一个完整的Git仓库.。
git的特性:
- 分布式版本控制系统 没有中心代码仓库,所有机器之间的地位同等
- 每次提取操作,实际上都是一次对代码仓库的完整备份
- 所有的操作都可以在本地执行
- git的分支模型,相当的轻量级
- 提交完全在本地完成,无须别人给你授权
基本概念
工作区、暂存区、本地仓库和远端分支
工作区:本地电脑上的某项目工程的代码文件夹就是工作区,这是你当前查看和编辑项目的文件的地方。你所做的任何更改首先会反映在这里。
暂存区:暂存区是一个简单的文件,它存储了你希望下次提交时包含的文件更改的快照。它是你从工作目录中选择要包含在下一提交中的更改的地方。
本地仓库:克隆自远程仓库,就是我们常说的版本库,版本库的内容来自暂存区。
远端分支:git push命令能将本地仓库的代码上传到远端分支,但是必须经过提交确认之后才能合入远程分支,托管在网络上的项目仓库中常用的远端仓库有github(国外)和gitee(国内)
版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
HEAD: 指向你最近一次提交后的结果
版本号:每次提交到git仓库就会产生一个版本号可以随时回退
版本日志:记录版本更新的信息。
Git分支:
Git分布式原理图
Git工作过程原理图
二、Git部署
Linux部署
环境
192.168.252.147 git-server
192.168.252.148 git-client
安装git
官方git下载地址:Index of /pub/software/scm/git/ (kernel.org)
所有机器
yum -y install git
git --version
git version 1.8.3.1
全局创建用户
1.创建用户配置信息(两个机子要不一样)
192.168.252.147 git-server
git config --global user.name wyq
git config --global user.email wyq@163.com
192.168.252.148 git-client
git config --global user.name syh
git config --global user.email syh@163.com
2.查看信息
git config --list
git-server创建裸库
192.168.252.147 git-server
1.创建git用户管理库
useradd git
passwd git
2..创建并初始化裸库
mkdir /git-server-repository
cd /git-server-repository
git init --bare testgit
3.修改权限
chown -R /git-server-repository
4.查看初始化的git
ls /git-server-repository/testgit
branches config description HEAD hooks info objects refs
git-client提供秘钥
ssh-keygen
ssh-copy-id -i git@192.168.252.147
git-client拉取仓库
git clone git@192.168.252.147:/git-server-repository/testgit/
Windows部署
三、Git操作
192.168.252.147 git-server
192.168.252.148 git-client
提交代码到仓库
命令
git add [文件或者代码名] #添加到暂存区
git commit -m "[对于文件的解释]" #添加到本地仓库
示例
192.168.252.148 git-client
1.切换到工作目录
cd testgit/
2.编辑文件
vim code.txt
3.添加到暂存区
git add code.txt
or
git add -A
4.提交到仓库分支
git commit -m "code1"
5.查看git状态
git status
版本回退
命令
git log #查看版本日志
git reset --hard [版本号|HEAD|HEAD^] #根据版本ID进行回退版本
git relog #查看历史文件
示例
1.切换目录
cd testgit/
2.再次编辑文件
echo "hhhhhh" >> code.txt
3.上传暂存区和提交
git add code.txt
git commit -m "hhhh"
4.查看版本
git log
commit 336374ecf40eb5e3aafd4b12c50699a9c7dc9bb2
Author: syh <syh@163.com>
Date: Sat Sep 7 20:24:06 2024 +0800
hhhh
commit 233e62fd6b932cf9696173e5dc8a7ea27706f67c
Author: syh <syh@163.com>
Date: Sat Sep 7 17:35:23 2024 +0800
code
2.回退版本
git reset --hard 233e62fd6b932cf9696173e5dc8a7ea27706f67c
HEAD 现在位于 233e62f code
3.查看code.txt
cat code.txt
删除文件
命令:
git rm [参数] [文件名]
tips:
-f 强制删除在暂存区和仓库文件
--cached 只删除暂存区的文件
示例
文件存在工作区需要删除:
1.添加文件但不提交暂存区
touch a.txt
2.查看git状态
git status
# 位于分支 master
# 未跟踪的文件:
# (使用 "git add <file>..." 以包含要提交的内容)
#
# a.txt
提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)
3.删除文件
rm -rf a.txt
4.查看状态
git status
# 位于分支 master
无文件要提交,干净的工作区
文件存在暂存区需要删除:
方法一:
1.创建文件
touch a.txt
2.提交git
git add a.txt
3.查看状态
git status
# 位于分支 master
# 要提交的变更:
# (使用 "git reset HEAD <file>..." 撤出暂存区)
#
# 新文件: a.txt
#
3.git暂存区删除
git rm --cached a.txt
rm 'a.txt'
4.查看状态
# 位于分支 master
# 未跟踪的文件:
# (使用 "git add <file>..." 以包含要提交的内容)
#
# a.txt
提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)
5.删除真实文件
rm -rf a.txt
6.查看状态
git status
# 位于分支 master
无文件要提交,干净的工作区
方法二:
1.创建文件
touch b.txt
2.提交
git add b.txt
3.查看状态
git status
# 位于分支 master
# 要提交的变更:
# (使用 "git reset HEAD <file>..." 撤出暂存区)
#
# 新文件: b.txt
#
4.强制删除
git rm -f b.txt
rm 'b.txt'
5.查看状态
git status
# 位于分支 master
无文件要提交,干净的工作区
ls
没有b.txt
方法三:
1.创建文件
touch c.txt
2.提交
git add c.txt
3.查看状态
git status
4.直接删除文件
rm -rf c.txt
5.查看文件状态
git status
# 位于分支 master
# 要提交的变更:
# (使用 "git reset HEAD <file>..." 撤出暂存区)
#
# 新文件: c.txt
#
# 尚未暂存以备提交的变更:
# (使用 "git add/rm <file>..." 更新要提交的内容)
# (使用 "git checkout -- <file>..." 丢弃工作区的改动)
#
# 删除: c.txt
#
6.git暂存区删除
git rm --cache c.txt
rm 'c.txt'
7.查看状态
git status
# 位于分支 master
无文件要提交,干净的工作区
修改文件名称
命令
git mv [旧名称] [新名称] 在暂存区修改文件名称
示例
1.创建文件
touch d.txt
2.提交暂存区
git add d.txt
3.查看状态
git status
# 位于分支 master
# 要提交的变更:
# (使用 "git reset HEAD <file>..." 撤出暂存区)
#
# 新文件: d.txt
#
4.修改文件名
git mv d.txt e.txt
5.查看状态
git status
# 位于分支 master
# 要提交的变更:
# (使用 "git reset HEAD <file>..." 撤出暂存区)
#
# 新文件: e.txt
#
ls
e.txt
代码上传到master分支
指令
git push [远程主机名] [本地分支名]:[远程分支名]
示例
1.创建一个文件
touch f.txt
echo "hello syh wyq" >> f.txt
2.提交暂存区上传本地仓库
git add f.txt
git commit -m "version1"
git push origin master
Counting objects: 6, done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (6/6), 436 bytes | 0 bytes/s, done.
Total 6 (delta 0), reused 0 (delta 0)
To git@192.168.252.147:/mygitrep/test
* [new branch] master -> master
测试:(删除本地仓库后再次拉取查看是否还有刚才创建的文件)
1.删除本地仓库
rm -rf testgit
2.拉取本地仓库
git clone git@192.168.252.147:/git-server-repository/testgit/
3.查看文件内容
cd testgit/
cat f.txt
创建分支和合并分支
命令
git branch [参数] [分支名] 创建分支等操作
git branch 查看当前所在分支
git checkout [分支名] 切换分支
git merge [分支名] 合并分支
示例
1.查看当前所在分支
git branch
* master
2.创建新的分支
git branch test
git branch
* master
test
3.切换到test分支
git checkout test
git branch
master
* test
4.编辑文件并提交
vim test.txt
git add test.txt
git commit -m "test"
5.查看test分支
ls
a.txt code.txt test.txt
6.查看master分支
git checkout master
ls
a.txt code.txt
合并分支
git checkout master
git merge test
删除分支
git branch -d test
tips:
如果分支合并以后分支没有什么用的话就可以删除
四、Gitlab
机器准备
IP | 主机名称 | 服务 | 配置 |
192.168.252.147 | gitlab-server | gitlab-17.1.1 | 2cpu 4G |
192.168.252.148 | client | 克隆仓库 | 均可 |
准备Gitlab
192.168.252.147 gitlab-server
1.配置yum源
vim /etc/yum.repos.d/gitlab-ce.repo
[gitlab-ce]
name=Gitlab CE Repository
baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el$releasever
gpgcheck=0
enabled=1
2.安装gitlab
yum install -y gitlab-ce
3.修改配置文件
vim /etc/gitlab/gitlab.rb
gitlab_rails['time_zone'] = 'Asia/Shanghai' #设置地区时间
external_url 'http://192.168.252.147' # 添加对外域名
git_data_dirs({
"default" => {
"path" => "/mnt/nfs-01/git-data"
}
}) #设置数据存放目录
gitlab_rails['gitlab_shell_ssh_port'] = 22 #开启ssh度端口
4.初始化gitlab
gitlab-ctl reconfigure
5.启动
gitlab-ctl start
登录gitlab
查看初始密码
cat /etc/gitlab/initial_root_password
访问
http://192.168.252.147
修改密码
新用户注册
注册
在这看这边登录会发现无法登录需要管理员给予权限登录
管理员给予登录权限
Admin Area ——> Users
登录新注册的用户
success!
功能
创建仓库
私有仓库
公有仓库
拉取推送代码
SSH方式
192.168.252.148 client
ssh-keygen
cat /root/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDLtjAtGm5YoNUmnfKVeU6Gi51feJ2UgStbNSpgJ3H2kfg3LeLj7+aFicxWJ6QzddVH84IIRLmVj1ZGJiJkjWSddhr3hS3yJMvSjrrjgGsQli3vZCoBymhGxQwiHZOJyDZWfKPkzynd0/9p41evwl54j3jqPsOC3LunZy4JhRCPuaXvKcZEy+Sf7li4hY0mq1mVuE0/txpzeOu5dcx7K8FjHiKt1d8qG1x2t7zeB8d2dx9gRJZS6CfspECHc6wE2H0W+cc+p7DPXwAyoE1AJf/MfDGqReHY83LlcKKCqEcZ8aCohh3Bu3GklMDo3ahh0j52Pfp8ItRd+qauH8QsGTvH root@mysql-slave1
添加公钥:
测试:
私有库:
克隆本地:
git clone git@192.168.252.147:root/privaterepo.git
显示:
正克隆到 'privaterepo'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)
接收对象中: 100% (3/3), done.
推送新文件:
cd privaterepo/
vim syh.txt
git add *
git commit -m "syh"
显示:
[main 1bb3c02] syh
1 file changed, 1 insertion(+)
create mode 100644 syh.txt
git push origin main # gitlab使用的主分支是main
显示:
Counting objects: 4, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 262 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@192.168.252.147:root/privaterepo.git
85879fd..1bb3c02 main -> main
公有库:
找一个没有发送SSH公钥的机器
192.168.252.146
git clone git@192.168.252.147:root/publicrepo.git
显示:
正克隆到 'publicrepo'...
git@192.168.252.147's password:
fatal: 'root/publicrepo.git' does not appear to be a git repository
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
发现即使输入密码也会会失败由此可以推出SSH方式拉取和推送必须在gitlab上进行公钥配置。
HTTP方式
私有库:
克隆仓库:
git clone http://192.168.252.147/root/privaterepo.git
显示:
正克隆到 'privaterepo'...
Username for 'http://192.168.252.147': root
Password for 'http://root@192.168.252.147':
remote: Enumerating objects: 6, done.
remote: Counting objects: 100% (6/6), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 6 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)
Unpacking objects: 100% (6/6), done.
推送文件:
cd privaterepo/
vim wyq.txt
git add *
git commit -m "wyq"
显示:
[main a725e2b] wyq
1 file changed, 1 insertion(+)
create mode 100644 wyq.txt
git push origin main
显示:
Username for 'http://192.168.252.147': root
Password for 'http://root@192.168.252.147':
Counting objects: 4, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 293 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To http://192.168.252.147/root/privaterepo.git
1bb3c02..a725e2b main -> main
公有库:
找一个没有发送SSH公钥的机器
192.168.252.146
克隆到本地:
git clone http://192.168.252.147/root/publicrepo.git
显示:
正克隆到 'publicrepo'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)
Unpacking objects: 100% (3/3), done.
可以得出没有配置SSH的公钥使用公有库HTTP拉取可以直接克隆到本地,同理配置SSH的也可以进行克隆
推送文件:
cd publicrepo/
vim xjj.txt
git add *
git commit -m "xjj"
显示:
[main c86429d] xjj
1 file changed, 1 insertion(+)
create mode 100644 xjj.txt
git push origin main
显示:
Username for 'http://192.168.252.147': root
Password for 'http://root@192.168.252.147':
Counting objects: 4, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 266 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To http://192.168.252.147/root/publicrepo.git
5ea7908..c86429d main -> main
总结
SSH方式需要在仓库中配置公钥
在私有库中在拉取的时候SSH拉取进行需要配置公钥才能直接拉取仓库,HTTP拉取需要使用gitlab的用户名和密码,在推送的时候,SSH可以直接推送,HTTP推送的时候也需要使用gitlab的用户名和密码才能推送
在公有库中在SSH拉取的时候如果没有配置公钥是没有办法进行拉取库的需要配置公钥才能直接拉取仓库,HTTP拉取的时候不需要使用gitlab的用户名和密码,在推送的时候SSH可以直接推送,HTTP推送的时候需要gitlab 的用户名密码。
文件上传
tag版本推送
指令:
git tag -a "[版本号]" -m "[描述信息]"
版本推送:
vim tag.txt
git add tag.txt
git commit -m "tag add"
显示:
[main 7f8ba80] tag add
1 file changed, 1 insertion(+)
create mode 100644 tag.txt
git tag -a "v1.1" -m "version1.1"
git tag
显示:
v1.1
git push origin v1.1
显示:
Counting objects: 10, done.
Compressing objects: 100% (7/7), done.
Writing objects: 100% (10/10), 3.34 KiB | 0 bytes/s, done.
Total 10 (delta 1), reused 3 (delta 0)
To git@192.168.252.147:root/privaterepo.git
* [new tag] v1.1 -> v1.1
分支版本推送
git branch
显示:
* main
git branch dev
显示:
dev
* main
git branch
git checkout dev
git branch
显示:
* dev
main
vim dev.txt
git add dev.txt
git commit -m "add dev"
显示:
[dev cd4346b] add dev
1 file changed, 1 insertion(+)
create mode 100644 dev.txt
git push origin dev
显示:
Counting objects: 4, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 321 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote:
remote: To create a merge request for dev, visit:
remote: http://192.168.252.147/root/privaterepo/-/merge_requests/new?merge_request%5Bsource_branch%5D=dev
remote:
To git@192.168.252.147:root/privaterepo.git
* [new branch] dev -> dev
备份和恢复
查看软件版本
cat /opt/gitlab/embedded/service/gitlab-rails/VERSION
17.1.1
开启数据备份
1.配置文件
vim /etc/gitlab/gitlab.rb
显示:
gitlab_rails['backup_path'] = "/var/opt/gitlab/backups" #备份的路径
gitlab_rails['backup_archive_permissions'] = 0644 #备份文件的默认权限
gitlab_rails['backup_keep_time'] = 604800 #保留时长,秒为单位,防止磁盘爆满
2.重启服务生成
gitlab-ctl reconfigure
gitlab-ctl restart
备份
gitlab-rake gitlab:backup:create
ll /var/opt/gitlab/backups/
恢复
原先的库
删除一个
恢复
gitlab-rake gitlab:backup:restore BACKUP=/var/opt/gitlab/backups/1725890347_2024_09_09_17.1.1 #最后面的备份文件只需要写到版本号即可
限制仓库大小
配置邮箱
测试控制台发送邮箱
打开配置文件:
vim /etc/gitlab/gitlab.rb
修改:
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.163.com"
gitlab_rails['smtp_port'] = 25
gitlab_rails['smtp_user_name'] = "18790526164@163.com"
gitlab_rails['smtp_password'] = "CQGBTOQIEFNTEDPP"
gitlab_rails['smtp_domain'] = "163.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = false
gitlab_rails['gitlab_email_from'] = '18790526164@163.com'
配置邮箱发送触发条件
测试:
cd privaterepo/
vim email.txt
git add *
git commit -m "email"
显示:
[main 49f49b7] email
1 file changed, 1 insertion(+)
create mode 100644 email.txt
git push origin main
显示:
Counting objects: 4, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 329 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@192.168.252.147:root/privaterepo.git
a725e2b..49f49b7 main -> main
项目权限设置
权限介绍
Guest(访客):可以创建issue、发表comment,不能读写版本库
Reporter(报告者):可以克隆代码,不能提交。适合QA/PM
Developer(开发者):可以克隆代码、开发、提交、push,但没有merge branch到Master权限。适用于普通开发者。
Maintainer(维护者):可以创建项目、添加tag、保护分支、添加项目成员,编辑项目。适用核心开发者。
Owner(所有者):可以设置项目的访问权限 -Visibility Level、删除项目、迁移项目、管理组成员。适用开发组组长。
该分支是master/main是受保护分支,开发者都无权限push,只有owner可以操作。
一般我们作为developer,是没有master/main权限的,只有owner才有合并代码权限。
权限设置
进入一个开发仓库
邀请协作者
设置权限
Developer权限示例
使用http拉取
git clone http://192.168.252.147/root/privaterepo.git
拉取成功
推送
主分支:
cd privaterepo/
vim usr.txt
git add *
git commit -m "user developer"
显示:
[main 6f966f1] user developer
1 file changed, 2 insertions(+)
create mode 100644 usr.txt
git push origin main
显示:
Username for 'http://192.168.252.147': SYH
Password for 'http://SYH@192.168.252.147':
Counting objects: 4, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 269 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: GitLab: You are not allowed to push code to protected branches on this project.To http://192.168.252.147/root/privaterepo.git
! [remote rejected] main -> main (pre-receive hook declined)
error: 无法推送一些引用到 'http://192.168.252.147/root/privaterepo.git'
无法推送成功,说明developer不能推送到main分支
其他分支:
cd privaterepo/
git checkout dev
显示:
分支 dev 设置为跟踪来自 origin 的远程分支 dev。
切换到一个新分支 'dev'
git branch
显示:
* dev
main
vim user.txt
git add *
git commit -m "user branch"
显示:
[dev 49116ae] user branch
1 file changed, 2 insertions(+)
create mode 100644 user.txt
git push origin dev
显示:
Username for 'http://192.168.252.147': SYH
Password for 'http://SYH@192.168.252.147':
Counting objects: 4, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 272 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote:
remote: To create a merge request for dev, visit:
remote: http://192.168.252.147/root/privaterepo/-/merge_requests/new?merge_request%5Bsource_branch%5D=dev
remote:
To http://192.168.252.147/root/privaterepo.git
cd4346b..49116ae dev -> dev
配置HTTPS
制作公钥和密钥
1.安装snap
yum install -y epel-release
yum install -y snapd
2.软链接
systemctl enable --now snapd
ln -s /var/lib/snapd/snap /snap
3.安装certbot
snap install --classic certbot
4.软链接
ln -s /snap/bin/certbot /usr/bin/certbot
5.制作公钥秘钥
certbot certonly --manual --preferred-challenges dns -d *.syhwyq.icu
修改配置文件重启
修改配置文件
vim /etc/gitlab/gitlab.rb
gitlab-ctl reconfigure