版本控制系统Git/Gitlab/GitHub

news2024/11/27 5:39:47

版本控制系统

git和svn:公司内部的代码仓库,用于存放项目代码,方便整合开发过程

公共代码仓库:github全球 gitee国内

git 分布式 ---没有中心代码库,所有机器之间的地位同等(每台机器上都有相同的代码)

svn 集中管理的 ---有中心代码库,其他都是客户端

git与svn介绍

1. git 分布式版本控制系统

客户端并不只提取最新版本的文件,而是把原始的代码仓库完整地克隆下来。
优点:
a.离线操作:开发者可以在没有网络的情况下进行提交和查看历史记录等操作,只需要在网络恢复后再推送更改即可。
b.快速执行:几乎所有 Git 操作都在本地执行,因此速度非常快。
c.灵活的分支管理:Git 的分支管理非常轻量级且强大,可以轻松创建、合并和删除分支,这对团队协作非常有利。
d.数据完整性:Git 通过校验和机制保证数据的完整性和一致性,减少数据丢失的风险。
Git 的缺点
a.存储空间占用:由于每个开发者都需要克隆整个仓库,因此会占用更多的磁盘空间。
b.代码保密性:如果项目中有需要保密的核心代码,那么使用 Git 可能会导致这些代码容易被泄露给不应该知道这些代码的开发者。     

2.svn 集中化的版本控制系统

Subversion (svn)是一个集中式的版本控制系统,它维护一个单一的中心仓库,所有的工作副本都从这个中心仓库获取最新的版本。SVN 的客户端行为主要围绕中心仓库进行,客户端通过网络连接到中心仓库进行文件的上传、更新和版本控制操作。
优点:
易于理解和使用:SVN 的工作方式较为直观,类似于传统的文件共享模型,使得新手更容易上手。
简单的同步过程:更新工作副本或提交更改到中心仓库的操作相对简单,通常只需要一步操作。
明确的版本控制:每个文件的版本号都是明确的,便于跟踪和管理。
良好的集成支持:许多集成开发环境 (IDEs) 和构建工具都内置了对 SVN 的支持,使得集成和使用更加方便。
缺点:
数据安全性风险:由于所有的版本历史都集中在一台服务器上,一旦服务器出现故障或遭受攻击,可能会导致数据丢失或损坏。
网络依赖性:所有的版本控制操作都需要网络连接,这可能会导致在没有网络的情况下无法进行版本控制操作。
性能问题:当项目变得非常大时,中心仓库可能会遇到性能瓶颈,尤其是在网络条件不佳的情况下。
分支管理复杂:相对于 Git,SVN 的分支管理和合并操作更加复杂和耗时。

3.git 相关概念---纯命令行

工作区;暂存区;版本库;HEAD;版本号.
1.工作区(Working Directory):
存放git版本仓库的目录就是工作区(放源代码的地方)
2.暂存区:
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,(会将代码添加到暂存区,没有问题之后在提交到版本库)
3.版本库(Repository):
工作区有一个隐藏目录.git,而是Git的版本库。
4.HEAD:指向你最近一次提交后的结果。(现在是哪个版本,头就会指向这个版本)
1. 添加到暂存区
git add  文件名          # 添加文件到暂存区 
git add  *               #将所有文件添加到暂存区

2. 从stage提交到当前master分支的HEAD:
git commit -m “版本描述信息” 
查看版本号:git log
版本号:每个版本都会有一个id号,也就是commit id,
版本号可以通过版本日志查看,可以使用git log查看每次的commit记录

git部署

环境:
    git-server    192.168.246.214  充当服务器
    client        192.168.246.213
​
安装:所有机器都安装
   [root@git-server ~]# yum install -y git
   [root@git-server ~]# git --version 
   git version 1.8.3.1
   
准备:
    因为Git是分布式版本控制系统,所以,每个客户端机器都必须自报家门:你的名字和Email地址。
    注意git config命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,
​
所有的机器都添加,只要邮箱和用户不一样就可以。 (作为身份标识,不需要真实邮箱)  
    # git config --global user.email "soho@163.com"     ----设置邮箱
    # git config --global user.name "soho"              ----加添用户

1、git使用

服务端

创建版本库

1.创建一个空目录在中心服务器上创建

[root@git-server ~]# mkdir /git-test
[root@git-server ~]# useradd git   #创建一个git用户用来运行git
[root@git-server ~]# passwd git  #给用户设置密码
[root@git-server ~]# cd /git-test/

2.通过git init命令把这个目录变成Git可以管理的仓库:

创建裸库

适用远程中心仓库使用;创建裸库才可以从别处push(传)代码过来,使用--bare参数

语法:git init --bare  库名字
[root@git-server git-test]# git init --bare testgit 
Initialized empty Git repository in /git-test/testgit/
[root@git-server ~]# chown git.git /git-test -R  #修改权限
2.仓库创建完成后查看库目录:
[root@git-server git-test]# cd testgit/
[root@git-server testgit]# ls
branches  config  description  HEAD  hooks  info  objects  refs

客户端操作

1.配置免密登录
[root@client ~]# ssh-keygen    #生成秘钥
[root@client ~]# ssh-copy-id -i git@192.168.246.214   
#将秘钥传输到git服务器中的git用户
2.克隆git仓库
[root@client ~]# git clone git@192.168.246.214:/git-test/testgit/
Cloning into 'testgit'...
warning: You appear to have cloned an empty repository.
[root@client ~]# ls  #查看仓库已经克隆下来了
anaconda-ks.cfg    testgit 

创建文件模拟代码提交到仓库

1.在testgit目录下创建一个测试文件test.txt
[root@client ~]# cd testgit/
[root@client testgit]# vi test.txt   #随便写点东西
2.把文件添加到暂存区:使用 "git add" 建立跟踪
[root@client testgit]# git add test.txt
注: 这里可以使用 git add * 或者 git add -A(提交当前目录下的所有文件)
3.提交文件到本地仓库分支:
[root@client testgit]# git commit -m "test1"
[master (root-commit) 2b51ff9] test1
 1 file changed, 2 insertions(+)
 create mode 100644 test.txt
 -m:描述
4.查看git状态:
 [root@client testgit]# git status 
# On branch master   #分支位于master
5.修改文件后再此查看状态:
[root@client testgit]# echo '1122334' >> test.txt
[root@client testgit]# git status
# 位于分支 master
# 尚未暂存以备提交的变更:
#   (使用 "git add <file>..." 更新要提交的内容)
#   (使用 "git checkout -- <file>..." 丢弃工作区的改动)
#
#   修改:      readme.txt
#
修改尚未加入提交(使用 "git add" 和/或 "git commit "
6.先add
[root@client testgit]# git add -A
8.再次提交commit:
[root@client testgit]# git commit  -m "add2" test.txt 
[master 73bf688] add2
 1 file changed, 1 insertion(+)
 [root@client testgit]# git status 
# On branch master
nothing to commit, working directory clean

2、版本回退

已经提交了不合适的修改到版本库时,想要撤销本次提交,使用版本回退,不过前提是没有推送到远程库。
已经提交了不合适的修改到版本库时,想要撤销本次提交,使用版本回退,不过前提是没有推送到远程库。

查看现在的版本:
[root@client testgit]# git log
显示的哪个版本在第一个就是当前使用的版本。  
版本回退(切换)

在Git中,上一个版本就HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100(一般使用id号来恢复)

回到上一个版本
[root@client testgit]# git reset --hard HEAD^ 
HEAD is now at 0126755 test1
2.回到指定的版本(根据版本号): 
[root@client testgit]# git reset --hard dd66ff
HEAD is now at dd66ff9 add2
==========================================================
注:消失的ID号:
回到早期的版本后再查看git log会发现最近的版本消失,可以使用reflog查看消失的版本ID,
用于回退到消失的版本
[root@vm20 gittest]# git reflog
3、删除文件

从工作区删除test.txt,并且从版本库一起删除

从工作区删除
[root@client testgit]# rm -rf test.txt 
从版本库删除:
[root@client testgit]# git rm test.txt 
rm 'test.txt'
[root@client testgit]# git commit -m "删除文件test.txt"
[master cebc081] 删除文件test.txt
 1 file changed, 3 deletions(-)
 delete mode 100644 test.txt
4、将代码上传到仓库的master分支
[root@client testgit]# vi a.txt   #创建一个新文件
[root@client testgit]# git add a.txt 
[root@client testgit]# git commit -m "add"
[root@client testgit]# git push origin master   #上传到远程仓库master分支
Counting objects: 11, done.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (11/11), 828 bytes | 0 bytes/s, done.
Total 11 (delta 0), reused 0 (delta 0)
To git@192.168.246.214:/git-test/testgit/
 * [new branch]      master -> master

测试:测试:

在客户端将仓库删除掉然后在克隆下来查看仓库中是否有文件

[root@git-client ~]# rm -rf testgit/
[root@client ~]# git clone git@192.168.246.214:/git-test/testgit/
Cloning into 'testgit'...
remote: Counting objects: 11, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 11 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (11/11), done.
[root@client ~]# cd testgit/
[root@client testgit]# ls
a.txt
[root@client testgit]# cat a.txt 
hello world

三、创建、合并分支

每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。HEAD是指向master,所以,HEAD指向的就是当前分支。

客户端操作

[root@client ~]# git clone git@192.168.246.214:/git-test/testgit/
[root@client testgit]# git status 
# On branch master   #当前所在为master分支
#
# Initial commit
#
nothing to commit (create/copy files and use "git add" to track)
​
创建分支:
[root@client testgit]# git branch dev   #创建分支。
[root@client testgit]# git branch    #查看分支。*在哪里就表示当前是哪个分支
  dev
* master
切换分支:
[root@client testgit]# git checkout dev
Switched to branch 'dev'
[root@client testgit]# git branch 
* dev
  master
在dev分支创建一个文件;
[root@client testgit]# vi test.txt
[root@client testgit]# git add test.txt 
[root@client testgit]# git commit -m "add dev"
[dev f855bdf] add dev
 1 file changed, 1 insertion(+)
 create mode 100644 test.txt
现在,dev分支的工作完成,我们就可以切换回master分支:
 [root@client testgit]# git checkout master
Switched to branch 'master'

切换回 分支后,再查看一个test.txt文件,刚才添加的内容不见了!因为那个提交是在dev分支上,而master分支此刻的提交点并没有变:

[root@client testgit]# ls
a.txt

现在,我们把dev分支的工作成果合并到master分支上:

[root@client testgit]# git merge dev
Updating 40833e0..f855bdf
Fast-forward
 test.txt | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 test.txt
[root@client testgit]# ls
a.txt  test.txt
现在已经将dev分支的内容合并到master上。确认没有问题上传到远程仓库:
[root@client testgit]# git push origin master

git merge命令用于合并指定分支到当前分支。合并后,再查看test.txt的内容,就可以看到,和dev分支的最新提交是完全一样的。

合并完成后,就可以放心地删除dev分支了。

[root@client testgit]# git branch -d dev
Deleted branch dev (was f855bdf).

删除后,查看branch,就只剩下master分支了:

[root@client testgit]# git branch 
* master

四、git标签

Git 标签(Tag)用于给仓库中的特定提交点加上标记,通常用于发布版本(如 v1.0, v2.0)。比如说,我们想为我们的 tmsc 项目发布一个 "1.0" 版本,可以用 git tag -a v1.0 命令给最新一次提交打上(HEAD) "v1.0" 的标签。

-a 选项意为"创建一个带注解的标签",不用 -a 选项也可以执行的,但不会记录这标签是啥时候打的,谁打的。推荐一直创建带注解的标签。

tag是git版本库的一个标记,指向某个commit的指针。

# 克隆远程仓库到本地
[root@client ~]# git clone git@192.168.229.168:/git-test/testgit
Cloning into 'testgit'...
# 成功克隆后,进入该仓库目录
[root@client ~]# cd testgit/
# 创建一个新的空文件 `a.txt`
[root@client testgit]# touch a.txt
# 将新创建的文件 `a.txt` 添加到暂存区
[root@client testgit]# git add a.txt
# 提交暂存区中的更改到仓库历史记录,并附带提交信息
[root@client testgit]# git commit -m "add 1"
[master 61a232c] add 1
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 a.txt
# 创建一个带有注释的标签 `v1.0`,指向当前的提交
[root@client testgit]# git tag -a v1.0
# 查看当前仓库中的所有标签
[root@client testgit]# git tag 
v1.0
# 在文件 `a.txt` 中追加内容
[root@client testgit]# echo 12321323 >> a.txt 
# 将修改后的文件 `a.txt` 添加到暂存区
[root@client testgit]# git add a.txt
# 提交暂存区中的更改到仓库历史记录,并附带提交信息
[root@client testgit]# git commit -m "add 2"
[master a5324a3] add 2
 1 file changed, 1 insertion(+)
# 创建一个带有注释的标签 `v1.1`,并指定标签信息,该标签指向当前的提交
[root@client testgit]# git tag -a "v1.1" -m "指定commit id"
# 再次查看当前仓库中的所有标签
[root@client testgit]# git tag 
v1.0
v1.1
# 查看标签 `v1.1` 的详细信息,包括标签创建者、时间戳及注释信息等
[root@client testgit]# git show v1.1
tag v1.1
Tagger: jack <jack@163.com>
Date:   Sat Aug 31 17:01:41 2024 +0800
第二次修改
commit a5324a3a0da23ffc878f0a69b7dcca2a0dec6002 # 指定标签关联的提交的 SHA-1 哈希值
Author: jack <jack@163.com> # 提交的作者及其邮箱地址
Date:   Sat Aug 31 17:01:24 2024 +0800 # 提交的时间(基于本地时区)
​ 
    add 2 # 提交信息,这里描述了本次提交所做的更改
​
diff --git a/a.txt b/a.txt # 文件差异报告,展示从上一个提交到当前提交之间文件的变化
index e69de29..59be678 100644 # 文件 `a.txt` 的两个版本之间的索引对比信息
--- a/a.txt
+++ b/a.txt
@@ -0,0 +1 @@
+12321323      # 从旧版本到新版本的具体改动,这里是在文件末尾添加了一行
[root@client testgit]# git push origin v1.0 #推送标签到远程仓库
Counting objects: 5, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (4/4), 358 bytes | 0 bytes/s, done.
Total 4 (delta 0), reused 2 (delta 0)
To git@192.168.209.168:/git-test/didipm
 * [new tag]         v1.0 -> v1.0
​
 #git push origin --tags  # 推送所有标签
​
[root@client testgit]# git tag -d v1.0 #删除本地标签
Deleted tag 'v1.0' (was 00265b7)
[root@localhost testgit]# git tag -d v1.1
Deleted tag 'v1.1' (was 4616fef)
​

测试

[root@client ~]# rm -rf testgit/
[root@client ~]# git clone git@192.168.229.168:/git-test/testgit
Cloning into 'didipm'...
remote: Counting objects: 18, done.
remote: Compressing objects: 100% (11/11), done.
remote: Total 18 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (18/18), 24.41 KiB | 0 bytes/s, done.
[root@client ~]# cd testgit/
[root@client testgit]# ls
[root@client testgit]# git tag  #查看现有标签
v1.0
v1.1
[root@client testgit]# git checkout v1.0 #切换标签
Note: checking out 'v1.0'.
​
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
​
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
​
  git checkout -b new_branch_name
​
HEAD is now at 61a232c... add 1
[root@client testgit]# ls
a.txt
[root@client testgit]# cat a.txt
[root@client testgit]# git checkout v1.1
Previous HEAD position was 61a232c... add 1
HEAD is now at a5324a3... add 2
[root@client testgit]# cat a.txt 
12321323
​
指定标签进行版本回退,做为一个新的branch继续增加功能
[root@client testgit]# git tag 
v1.0
v1.1
v1.2
# 在 v1.0 基础上创建新标签 v1.0.1
bash
[root@client testgit]# git reset --hard v1.0
HEAD is now at 61a232c add 1
[root@client testgit]# cat a.txt
[root@client testgit]# echo hangzhou >> a.txt 
[root@client testgit]# git add a.txt
[root@client testgit# git commit -m "hangzhou"
[detached HEAD b2fa719] hangzhou
 1 file changed, 1 insertion(+)
[root@client testgit]# git tag -a "v1.0.1" -m "b2fa719"
[root@client testgit]# git tag 
v1.0
v1.0.1
v1.1
v1.2
[root@client testgit]# git push origin v1.0.1 #推送到远程仓库
Counting objects: 6, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (4/4), 350 bytes | 0 bytes/s, done.
Total 4 (delta 0), reused 0 (delta 0)
To git@192.168.209.168:/git-test/didipm
 * [new tag]         v1.0.1 -> v1.0.1

删除远程仓库上的标签

[root@client testgit]# git push --delete origin v1.0
To git@192.168.209.168:/git-test/didipm
 - [deleted]         v1.0

Tag 和 branch 都是 Git 中的重要概念,但它们有不同的用途。

Branch 是一个分支,指向 Git 仓库中某个提交(commit)。每个分支都相互独立,可以修改代码和提交新的提交,并在需要时合并两个分支。分支可以在 Git 中用于协作开发,并且可以允许多个用户同时修改同一个项目而不会影响其他用户的工作。

Tag 是一个标签,可以用来记录某个特定的提交。一般情况下,一个 Tag 被用来标记重要的历史节点,如版本发布或一些重大事件。Tag 通常是不会被修改或删除的,因为它们代表了项目在某个特定时刻的状态。

因此,Branch 用于在项目开发阶段进行代码版本控制,Tag 则用于标记项目的里程碑并提供版本发布历史记录。

五、部署gitlab服务

准备环境: 关闭防火墙和selinux

192.168.246.214  #gitlab服务器

配置yum源

~]# yum install -y git
~]# cd /etc/yum.repos.d/
yum.repos.d]# vim 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
安装相关依赖
yum.repos.d]# yum install -y curl policycoreutils-python openssh-server
yum.repos.d]# systemctl enable sshd
yum.repos.d]# systemctl start sshd
安装postfix
yum.repos.d]# yum install postfix  #安装邮箱
yum.repos.d]# systemctl enable postfix
yum.repos.d]# systemctl start postfix
​
yum.repos.d]# yum install -y gitlab-ce-13.1.1-ce.0.el7.x86_64  #安装的版本
yum.repos.d]# yum install -y gitlab-ce  #将会安装gitlab最新版本

配置gitlab

[root@git-server ~]# vim /etc/gitlab/gitlab.rb
1.# 添加对外的域名(gitlab.papamk.com请添加A记录指向本服务器的公网IP):将原来的修改为
external_url 'http://192.168.246.214'
2.设置地区
gitlab_rails['time_zone'] = 'Asia/Shanghai'

将数据路径的注释去掉,可以更改

开启ssh服务:

开启邮箱服务

gitlab_rails['smtp_enable'] = true  #开启smtp服务
gitlab_rails['smtp_address'] = "smtp.163.com" #指定smtp地址
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "xxxx@163.com"  #指定邮箱
gitlab_rails['smtp_password'] = "邮箱授权密码"
gitlab_rails['smtp_domain'] = "163.com"  #邮箱地址的域
gitlab_rails['smtp_authentication'] = "login" 
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true
gitlab_rails['smtp_openssl_verify_mode'] = 'none'
gitlab_rails['gitlab_email_from'] = 'xxxx@163.com' #指定发件邮箱
gitlab_rails['gitlab_email_display_name'] = 'Admin' #指定发件人
#user["git_user_email"] = "xxxx@163.com"

重置加载GitLab

gitlab-ctl reconfigure   #重新加载,需要等很长时间

启动

gitlab-ctl restart  #启动

邮箱测试

[root@git-server ~] # gitlab-rails console
irb(main):001:0> Notify.test_email('xxxx@qq.com', 'Message Subject', 'Message Body').deliver_now #测试发送邮件是否成功
Notify#test_email: processed outbound mail in 1.4ms
Delivered mail 5ffa335015800_3de43fa76d4cf9b0686ba@localhost.localdomain.mail (956.6ms)
Date: Sun, 10 Jan 2021 06:50:56 +0800
From: Admin <xxxx@163.com>
Reply-To: Admin <noreply@192.168.246.214>
To: 503875980@qq.com
Message-ID: <5ffa335015800_3de43fa76d4cf9b0686ba@localhost.localdomain.mail>
Subject: Message Subject
Mime-Version: 1.0
Content-Type: text/html;
 charset=UTF-8
Content-Transfer-Encoding: 7bit
Auto-Submitted: auto-generated
X-Auto-Response-Suppress: All
​
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><p>Message Body</p></body></html>
​
=> #<Mail::Message:69987905152360, Multipart: false, Headers: <Date: Sun, 10 Jan 2020 06:50:56 +0800>, <From: Admin <xxxx@163.com>>, <Reply-To: Admin <noreply@192.168.246.214>>, <To: xxxx@qq.com>, <Message-ID: <5ffa335015800_3de43fa76d4cf9b0686ba@localhost.localdomain.mail>>, <Subject: Message Subject>, <Mime-Version: 1.0>, <Content-Type: text/html; charset=UTF-8>, <Content-Transfer-Encoding: 7bit>, <Auto-Submitted: auto-generated>, <X-Auto-Response-Suppress: All>>
irb(main):002:0> quit  #退出

测试访问

 :http://192.168.246.214

用户为:root

密码:为刚才设置的本人设置的密码是12345678

创建秘钥

[root@client ~]# ssh-keygen
[root@client ~]# cd .ssh/
[root@client .ssh]# ls 
[root@client .ssh]# cat id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC0HeO8gaua13h9HCJK5RXVc/cjet9DpLYq2dqmQ0LXfP0Vwj6YjKxu7lE1i/4Y2cmu5lDe8bG22aikyaW38Fnz0bkGfEurdVZii/KCiHBz2lXS1ocuAdloJT4wnc2MUjh/gwc4FuNkWdYvpbMLXSSHIVjv8vB9YbHlPMTMy5N89kMwMmta5C87/8fBO5VtGijgGOueywM+xAzovlfoJbprV/ZBKkhiskSKz4fHyoGFGwllX3kMkNR/soGF5XXA+/99iO3UqSaloF0UzfUCgqfMfMVB5zDHGIB6uTrMe6ccfKp9gnVyD7m4Zmk7MwouBwAfMLIiHmvekBGXqb1YCTgJ root@client

添加秘钥 

点击add key ,可以不设置时间

不设置时间,默认没有到期时间,永久 

继续添加密钥

点击用户的settings -> SSH Keys 

新建上传文件

创建一个文件

1.newfile:先新建一个文件。2.uploadfile:再上传即可。

上传一个文件

修改上传文件大小

创建分支

进入Project页面

点击左侧的Repository 

选择clone分支代码或者上传到代码到分支

git客户端上传文件
[root@localhost ~]# git clone git@192.168.229.188:root/testapp.git
Cloning into 'testapp'...
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 5 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (5/5), done.
[root@localhost ~]# cd testapp/
[root@localhost testapp]# git branch 
* master
[root@localhost testapp]# git checkout dev
Switched to a new branch 'dev'
[root@localhost testapp]# git branch 
* dev
  master
  
[root@localhost testapp]# touch aa.txt
[root@localhost testapp]# echo 123123 >> aa.txt 
[root@localhost testapp]# git add *
[root@localhost testapp]# git commit -m "add 1"
[dev cf25148] add 1
 1 file changed, 1 insertion(+)
 create mode 100644 aa.txt
[root@localhost tmsc]# git push origin dev
Counting objects: 4, done.
Writing objects: 100% (3/3), 228 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.229.188/root/testapp/-/merge_requests/new?merge_request%5Bsource_branch%5D=dev
remote: 
To git@192.168.229.188:root/testapp.git
   7d5a612..8aa27e0  dev -> dev
打标签Tag
# 克隆远程仓库到本地
[root@localhost ~]# git clone git@192.168.229.188:root/testapp.git
Cloning into 'testapp'... # 开始克隆仓库
remote: Enumerating objects: 14, done. # 枚举对象
remote: Counting objects: 100% (14/14), done. # 计算对象
remote: Compressing objects: 100% (7/7), done. # 压缩对象
remote: Total 14 (delta 1), reused 0 (delta 0), pack-reused 0 # 总共的对象数
Receiving objects: 100% (14/14), done. # 接收对象
Resolving deltas: 100% (1/1), done. # 解析差异
[root@localhost ~]# cd testapp/ # 进入克隆下来的目录
[root@localhost testapp]# ls # 查看当前目录下的文件
aa.txt
[root@localhost testapp]# cat aa.txt # 显示文件内容
12323
[root@localhost testapp]# git tag # 列出所有标签
v1.1
[root@localhost testapp]# ls # 再次查看当前目录下的文件
aa.txt
[root@localhost testapp]# git checkout dev # 切换到dev分支
Branch dev set up to track remote branch dev from origin. # 设置dev分支跟踪远程origin的dev分支
Switched to a new branch 'dev' # 切换到了dev分支
[root@localhost testapp]# ls # 查看切换分支后的文件列表
aa.txt
[root@localhost testapp]# cat aa.txt # 查看文件内容
12323
[root@localhost testapp]# echo hello >> aa.txt # 向文件追加内容
[root@localhost testapp]# git add * # 将所有更改添加到暂存区
[root@localhost testapp]# git commit -m "add 5" # 提交更改,消息为"add 5"
[dev 0c989ff] add 5
 1 file changed, 1 insertion(+)
[root@localhost testapp]# git checkout master # 切换回master分支
Switched to branch 'master'
[root@localhost testapp]# git merge dev # 将dev分支合并到master分支
Merge made by the 'recursive' strategy.
 aa.txt | 1 +
 1 file changed, 1 insertion(+)
[root@localhost testapp]# git tag -a "v1.11" # 创建带注释的标签v1.11
[root@localhost testapp]# git tag # 列出所有标签
v1.1
v1.11
[root@localhost testapp]# git push origin v1.11 # 将标签推送到远程仓库
[root@localhost testapp]# git tag --delete v1.0 # 删除本地标签
[root@localhost testapp]# git push origin --delete v1.0 # 删除一个远程标签

创建用户

1.自己创建一个用户

新添加的用户创建成功!

2.通过邮箱创建用户--公司常用

首先需要管理员用户登陆gitlab开始创建用户

这时候创建成功,然后需要通过邮箱发送的地址链接自行进行设置密码。-登陆邮箱

重置密码成功后登陆

使用gitlab

在服务器通过在git客户端

[root@client ~]# git clone git@192.168.246.214:root/testapp.git
Cloning into 'testapp'...
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)
Receiving objects: 100% (6/6), done.
[root@client ~]# ls
testapp
[root@client ~]# cd testapp/
[root@client testapp]# ls
test.txt  同步时间.txt
[root@client testapp]#
注意:如果克隆不下来可以重新使用命令生成私钥
[root@client ~]# ssh-keygen -t rsa #然后将公钥添加到gitlab中。
​
使用http的
[root@client ~]# rm -rf testgit/
[root@client ~]# git clone http://192.168.246.214/root/testapp.git
Cloning into 'testapp'...
Username for 'http://192.168.246.214': root
Password for 'http://root@192.168.246.214':12345678  #为自己设置的密码
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)
Unpacking objects: 100% (6/6), done.
[root@client ~]# ls
testapp
提交到远程gitlab仓库
[root@client ~]# cd testapp/
[root@client testapp]# vi update.txt
1000phone
[root@client testapp]# git add .
[root@client testapp]# git commit -m 'updata-test'
[root@client testapp]# git push origin master
Counting objects: 4, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 266 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
To git@192.168.153.156:root/testapp.git
   4f35d4b..a0067ea  master -> master

​Gitlab 备份与恢复

1、查看系统版本和软件版本

[root@git-server ~]# cat /etc/redhat-release 
CentOS Linux release 7.4.1708 (Core)
​# 查看gitlab的版本
[root@git-server ~]# cat /opt/gitlab/embedded/service/gitlab-rails/VERSION
13.1.1

2、数据备份

打开/etc/gitlab/gitlab.rb配置文件,查看一个和备份相关的配置项:

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               #保留时长,秒为单位

该项定义了默认备份出文件的路径,可以通过修改该配置,并执行 gitlab-ctl reconfigure 或者 gitlab-ctl restart 重启服务生效。

[root@git-server ~]# gitlab-ctl reconfigure
或者
[root@git-server ~]# gitlab-ctl  restart

执行备份命令进行备份

/opt/gitlab/bin/gitlab-rake gitlab:backup:create

也可以添加到 crontab 中定时执行:

0 2 * * * /opt/gitlab/bin/gitlab-rake gitlab:backup:create 

备份完成,会在备份目录中生成一个当天日期的tar包。

[root@git-server ~]# ls /var/opt/gitlab/backups/
1588774133_2020_05_06_12.10.3_gitlab_backup.tar

3、数据恢复

特别注意:

  • 备份目录和gitlab.rb中定义的备份目录必须一致
  • GitLab的版本和备份文件中的版本必须一致,否则还原时会报错。

在恢复之前,可以删除一个文件,以便查看效果

执行恢复操作:

[root@git-server ~]# cd /var/opt/gitlab/backups/
[root@git-server backups]# gitlab-rake gitlab:backup:restore BACKUP=1588774133_2020_05_06_12.10.3
注意恢复文件的名称

恢复完成后,或者重启服务,再打开浏览器进行访问,发现数据和之前的一致:

[root@git-server backups]# gitlab-ctl  restart

注意:通过备份文件恢复gitlab必须保证两台主机的gitlab版本一致,否则会提示版本不匹配

Github 远程仓库

github是一个代码托管平台

1、github.com 注册账户---wxx0417

2、在github上创建仓库

3、生成本地ssh key

[root@localhost ~]# ssh-keygen -t rsa -C 'meteor@163.com' 
# 邮箱要与github上注册的相同
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:RiE6UR1BtzV5avyE2uz6TNPsVHa2D2eHprghrJEkd/g meteor@163.com
The key's randomart image is:
+---[RSA 2048]----+
|    ..oo=o. o.   |
|     o ..o o...  |
|    o   . .. +   |
|     . o    = .  |
|    . + S  = o  =|
|     + *  . oo.=o|
|      o E ..o B.+|
|       o . =.* +o|
|      .   +++ . .|
+----[SHA256]-----+

[root@localhost ~]# cat .ssh/id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDVThfq4brrlsPGtAknVB0TLPx+7Dd3qlxTbSIrUOsGC5Y8JuNqVTlIntZB4oNj8cSQrWvec9CKm0a8o7WwaJIiqpxurz+YpQHP2KbapftKIxsX4hPf/z+p0El1U6arQa35/xmNsq+cJLH/bDdRG+EMDhuCBmjVZOlLj/hEdeIT6s56AnnCkaWoF+sq58KCF7Tk54jRbs/YiyE4SN7FuA70r+07sA/uj0+lmuk4E190KtQUELhjX/E9stivlqiRhxnKvVUqXDywsjfM8Rtvbi4Fg9R8Wt9fpd4QwnWksYUoR5qZJFYXO4hSZrUnSMruPK14xXjDJcFDcP2eHIzKgLD1 meteor@163.com

4、复制以上的公钥,在github 中添加ssh key

创建好库之后,在库里创建几个文件,方便测试

5、测试:拉取github仓库

[root@client ~]# git clone git@github.com:wxx0417/pmtest.git
Cloning into 'pmtest'...
The authenticity of host 'github.com (52.74.223.119)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
RSA key fingerprint is MD5:16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,52.74.223.119' (RSA) to the list of known hosts.
remote: Enumerating objects: 6, done.
remote: Counting objects: 100% (6/6), done.
remote: Compressing objects: 100% (3/3), done.
Receiving objects: 100% (6/6), done.
remote: Total 6 (delta 0), reused 0 (delta 0), pack-reused 0
[root@client ~]# ls
anaconda-ks.cfg  pmtest

6、并推送至github仓库

[root@client ~]# cd pmtest/
[root@client pmtest]# ls
README.md  testapp
[root@client pmtest]# cat testapp 
this is  
[root@client pmtest]# vi qf.txt
1000phone
[root@client pmtest]# git add .
[root@client pmtest]# git commit -m 'test2'
[master d12615b] test2
 1 file changed, 1 insertion(+)
 create mode 100644 qf.txt
[root@client pmtest]# git push origin HEAD:master
Counting objects: 4, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 297 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@github.com:wxx0417/pmtest.git
   d3dcc6f..d12615b  master -> master

去github界面查看

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2100170.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++ 面试 - STL】每日 3 题(三)

​ ✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

2024年8月——大模型更新汇总

让我们来看一下8月份有哪些大模型更新&#xff0c;涵盖了多个领域&#xff0c;包括语言模型、视觉模型以及数学模型等。以下是本次更新的主要亮点&#xff1a; 1、 智谱系列升级&#xff1a; a、GLM-4-Flash&#xff1a;免费供应&#xff0c;提供快速响应的对话体验。 b、GLM-4…

Linux--网络指令UDP,TCPwindows连接服务器

网络指令 ping命令 用来检测网络连通性的。 比如ping 百度的官网 ping www.bai.com 这个指令执行后默认是不会停下来的&#xff0c;我们可以加入 -c 数字选项&#xff0c;表示要ping几次 比如ping两次 ping -c2 www.bai.com netstat 查看所有的网络连接活动 netstat…

《云原生安全攻防》-- K8s攻击案例:高权限Service Account接管集群

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 在本节课程中…

提高编程效率的秘密武器:探索高效开发工具

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《热点时事》 期待您的关注 目录 引言 一、工具介绍 Visual Studio Code (VS Code) Docker GitHub 二、效率对比 三、未来趋…

详细解说一下Python中的递归和基例

大家好&#xff0c;感谢阅读胡萝卜不甜的文章&#xff0c;谢谢你的关注和点赞。好戏马上开始 考点&#xff1a; 递归函数是一种在函数定义中调用自身的函数。递归函数通常包含两个主要部分&#xff1a;递归部分和基例&#xff08;也称为递归终止条件&#xff09;。 递归部分&am…

给你的头像加个口罩网站html源码

源码介绍 给你的头像加个口罩网站html源码&#xff0c;html网页源码&#xff0c;直接打开即可使用&#xff0c;也可以上传到网站。 效果预览 源码获取 给你的头像加个口罩网站html源码

【亚马逊运营经验帖】跨境选品9大实操策略,小白必看!

一个新手卖家要想在亚马逊这个庞大的平台上分得一杯羹&#xff0c;不深入了解一些选品的技巧恐怕是不行的。七分靠选品&#xff0c;三分靠运营。可见选品的成功与否对于一个 listing 能否快速爆单至关重要&#xff0c;这篇文章是从帮助小白的角度去分析选品的一些基本思路。 1…

科研论文必须要了解的25个学术网站

各位同学大家好&#xff0c;我是Toby老师&#xff0c;今天介绍一下科研论文必须要了解的25个学术网站。下述论文网站收藏内容有差异&#xff0c;大家可以检索比较。 1.SCI SCI&#xff08;Science Citation Index&#xff09;是一个学术引文数据库&#xff0c;收录了全球多个学…

《PCI Express体系结构导读》随记 —— 第II篇 第7章 PCIe总线的数据链路层与物理层(5)

接前一篇文章&#xff1a;《PCI Express体系结构导读》随记 —— 第II篇 第7章 PCIe总线的数据链路层与物理层&#xff08;4&#xff09; 7.1 数据链路层的组成结构 7.1.1 数据链路层的状态 数据链路层需要通过物理层监控PCIe链路的状态&#xff0c;并维护数据链路层的“控制与…

鸿蒙开发画廊效果

鸿蒙开发画廊效果&#xff1a; 画廊这种效果确实不错&#xff0c;看起来高端大气。在Android那边已经有不少案例了&#xff0c;但是鸿蒙这边还是很少。今天来分享一个。 先看下效果图&#xff1a; 没法弄gif,就是左右可以看到前一张&#xff0c;下一张。 也可以看我b站完整的…

C# 编译程序引用C++DLL托管动态链接库实例

构建 C# 程序引用CDLL托管动态链接库 前言1、统一框架版本2、统一编译平台3、C 托管动态链接库的优点3.1、C 托管动态链接库引用方便简单3.2、C 托管动态链接库加快了程序构建和重复利用3.3、C 托管动态链接库源代码更加安全 4、构建与 C# 程序进行互操作的C.DLL动态链接库的三…

UTB定位技术能不能精准定位

在当今科技日新月异的时代&#xff0c;定位技术以其广泛的应用场景和不断提升的精度&#xff0c;成为了多个领域的核心支撑。其中&#xff0c;UTB定位技术以其高精度、低延迟和高抗干扰性等特点&#xff0c;在众多定位技术中脱颖而出&#xff0c;成为精准定位领域的佼佼者。那么…

ContentProvider 数据供给方

作用 ContentProvider使用数据库模型的基本表格来提供需要共享的数据 表格每一行表示一条记录&#xff08;都包含"_ID"字段&#xff09;&#xff0c;每一列表示该类型的数据 URI 作用 资源的唯一标识符——提供数据位置 组成 scheme: 一般 "content:/"…

病理AI重点方向:普通HE与免疫组化之间的关系|文献速递·24-09-03

小罗碎碎念 本期推文主题&#xff1a;免疫组化 这一期的推文很有意思&#xff0c;看完第一篇文献就知道了——兽医写的与免疫组化相关的内容——普渡大学兽医学院比较病理学系。 最近一直在了解免疫组化与HE之间的关系&#xff0c;在阅读文献的时候&#xff0c;无意间看到了第…

HashMap底层逻辑理解(数组+链表+红黑树)

jdk1.7底层是由数组链表实现jdk1.8底层是由数组链表红黑树实现 以下都是数组链表红黑树对应的描述&#xff1a; public static void main(String[] args) {HashMap<String, String> map new HashMap<>();map.put("Aa", "Value1");map.put(&…

捷邻系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;商品分类管理&#xff0c;商品信息管理&#xff0c;促销产品管理&#xff0c;订单管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;商品信息&#…

如何处理海量数据

目录 1.海量数据简介 海量数据的产生 海量数据的处理 2.利用位图解决 题目一 题目二 题目三 题目一变形 3.利用布隆过滤器解决 题目一 4.哈希切割解决 题目一 题目二 5.海量数据处理总结 1.海量数据简介 海量数据的产生 随着互联网的迅速发展&#xff0c;互联…

堆排、快速排序、归并排序等总结

十大经典排序算法大梳理 (动图代码)&#xff08;动态图参考&#xff09; 排序算法平均时间复杂度最差时间复杂度空间复杂度数据对象稳定性冒泡排序O(n2)O(n2)O(1)稳定选择排序O(n2)O(n2)O(1)数组不稳定、链表稳定插入排序O(n2)O(n2)O(1)稳定快速排序O(n*log2n)O(n2)O(log2n)不…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《省间中长期市场连续运营下考虑耦合安全约束的电力交易联合优化出清模型》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…