当前位置: 首页 > article >正文

Git版本控制工具

一、Git的介绍

介绍

Git是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。分布式相比于集中式的最大区别在于开发者可以提交到本地,每个开发者通过克隆,在本地机器上拷贝一个完整的Git仓库.。

git的特性:

  1. 分布式版本控制系统 没有中心代码仓库,所有机器之间的地位同等
  2. 每次提取操作,实际上都是一次对代码仓库的完整备份
  3. 所有的操作都可以在本地执行
  4. git的分支模型,相当的轻量级
  5. 提交完全在本地完成,无须别人给你授权

基本概念

工作区、暂存区、本地仓库和远端分支

工作区:本地电脑上的某项目工程的代码文件夹就是工作区,这是你当前查看和编辑项目的文件的地方。你所做的任何更改首先会反映在这里。

暂存区:暂存区是一个简单的文件,它存储了你希望下次提交时包含的文件更改的快照。它是你从工作目录中选择要包含在下一提交中的更改的地方。

本地仓库:克隆自远程仓库,就是我们常说的版本库,版本库的内容来自暂存区。

远端分支: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


http://www.kler.cn/a/304403.html

相关文章:

  • Matlab实现鹈鹕优化算法(POA)求解路径规划问题
  • IPv4与IPv6的优缺点
  • 网络安全:挑战、策略与未来趋势
  • 深入浅出rust内存对齐
  • 【LeetCode】【算法】49. 字母异位词分组
  • 如何平滑切换Containerd数据目录
  • 如何模拟一个小程序项目打包的流程
  • php 实现JWT
  • 用于客户支持的 GenAI:探索 Elastic Support Assistant
  • 如何让Windows控制台窗口不接受鼠标点击(禁用鼠标输入)
  • 前端工程师职业发展路线图
  • MADE A PIE 之动态树形图
  • 解决Docker镜像不可下载
  • 【GBase 8c V5_3.0.0 分布式数据库常用几个SQL】
  • 使用 Node Media Server 和 FFmpeg 创建直播流,推送本地视频
  • 在 Mac 上安装双系统会影响性能吗,安装双系统会清除数据吗?
  • 使用VSCode 安装SAP Fiori 开发所需插件
  • el-tree父子不互相关联时,手动实现全选、反选、子级全选、清空功能
  • Qt 构建报错 undefined reference to xxx
  • C++字符串中的string类操作
  • Humanize AI 简介
  • C和指针:函数
  • Leetcode 701-二叉搜索树中的插入操作
  • 安卓开发板_联发科MTK开发板使用ADB开发
  • Excel--不规则隔行填充底纹颜色
  • 【动手学深度学习】08 线性回归 + 基础优化算法(个人向笔记)