Git分布式版本控制服务搭建

git的介绍:

  • Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
  • Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
  • Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。

Git 与 SVN 区别

  • Git 不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等。

  • 如果你是一个具有使用 SVN 背景的人,你需要做一定的思想转换,来适应 Git 提供的一些概念和特征。

  • Git 与 SVN 区别点:
    1、Git 是分布式的,SVN 不是:这是 Git 和其它非分布式的版本控制系统,例如 SVN,CVS 等,最核心的区别。
    2、Git 把内容按元数据方式存储,而 SVN 是按文件:所有的资源控制系统都是把文件的元信息隐藏在一个类似 .svn、.cvs 等的文件夹里。

    3、Git 分支和 SVN 的分支不同:分支在 SVN 中一点都不特别,其实它就是版本库中的另外一个目录。

    4、Git 没有一个全局的版本号,而 SVN 有:目前为止这是跟 SVN 相比 Git 缺少的最大的一个特征。

    5、Git 的内容完整性要优于 SVN:Git 的内容存储使用的是 SHA-1 哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。
    在这里插入图片描述

  • 集中式版本控制系统:

    1. 开发者之间共用一个仓库(repository)
    2. 所有操作需要联网
  • 分布式版本控制系统:

    1. 每个开发者都是一个仓库的完整克隆,每个人都是服务器,安全性极高
    2. 支持断网操作

Git的基本概念:

  • Git仓库:
    保存所有数据的地方
  • 工作区:
    从仓库中提取出来的文件,放在磁盘上供你使用及修改
  • 暂存区:
    就是一个文件,索引文件,保存了下次将提交的文件列表信息

Git的工作流程:

在这里插入图片描述

Git的基本操作

  • Git服务器:192.168.20.10
  • Git客户端:192.168.20.20

1.服务端安装Git软件:

[root@localhost ~]# yum -y install git

2.初始化一个空仓库:

[root@localhost ~]# mkdir /var/git
[root@localhost ~]# git init /var/git/project --bare
[root@localhost ~]# ls /var/git/project
config  description  HEAD  hooks  info  objects  refs
  • 使用git常用指令列表如表所示:
指令 作用
clone 将远程的服务器的仓库克隆到本地
config 修改Git配置
add 添加修改暂存区
commit 提交修改到本地仓库
push 提交修改到远程服务器

注意:以上的操作是服务端操作

3.客户端安装Git软件

[root@web2 ~]# yum -y install git

4.clone克隆服务器仓库到本地

[root@web2 ~]# git clone [email protected]:/var/git/project 
[root@web2 ~]# cd project
[root@web2 ~]# ls 

5.修改Git配置

[root@web2 project]# git config --global user.email "[email protected]"    ---这里指定你的邮箱
[root@web2 project]# git config --global user.name "Your Name" ---这里指定你的名字
[root@web2 project]# cat ~/.gitconfig 
[user]
	email = [email protected]
	name = Your Name

6. 本地工作区对数据进行增删改查

注意:必须要先进入仓库再操作数据

[root@web2 project]# echo "init date" > init.txt
[root@web2 project]# mkdir demo
[root@web2 project]# cp /etc/hosts demo
[root@web2 project]# git status ---查看仓库中数据的状态

7. 将工作区的修改提交到暂存区

[root@web2 project]# git add .

8. 将暂存区修改提交到本地仓库

[root@web2 project]# git commit  -m  "注释,可以为任意字符" ---这里的-m后面双引号
[root@web2 project]# git status

9.将本地仓库中的数据推送到远程服务器

[root@web2 project]# git config --global push.default simple
[root@web2 project]# git push
[email protected]'s password:  输入服务器root密码
[root@web2 project]# git status

10.将服务器上的数据更新到本地

备注:可能其他人也在修改数据并提交服务器,就会导致自己的本地数据为旧数据,使用pull就可以将服务器上新的数据更新到本地

[root@web2 project]# git pull

11.标题查看版本日志。

[root@web2 project]# git log
[root@web2 project]# git log --pretty=oneline
[root@web2 project]# git log --oneline
[root@web2 project]# git reflog

备注:客户端也可以使用图形程序访问服务器。

  • Windows需要安装git和tortoiseGit。如图所示。
    在这里插入图片描述在这里插入图片描述

HEAD指针操作

  • HEAD指针的概述:
  1. HEAD指针是一个可以在任何分支和版本移动的指针
  2. 通过移动指针我们可以将数据还原至任何版本

1. 实验准备工作:

[root@web2 project]# echo "new file" > new.txt
[root@web2 project]# git add .
[root@web2 project]# git commit -m "add new.txt"

[root@web2 project]# echo "first" >> new.txt
[root@web2 project]# git add .
[root@web2 project]# git commit -m "new.txt:first line"

[root@web2 project]# echo "second" >> new.txt
[root@web2 project]# git add .
[root@web2 project]# git commit -m "new.txt:second"

[root@web2 project]# echo "third" >> new.txt
[root@web2 project]# git add .
[root@web2 project]# git commit -m "new.txt:third"
[root@web2 project]# git push

[root@web2 project]# echo "123" > num.txt
[root@web2 project]# git add .
[root@web2 project]# git commit -m "num.txt:123"

[root@web2 project]# echo "456" > num.txt
[root@web2 project]# git add .
[root@web2 project]# git commit -m "num.txt:456"

[root@web2 project]# echo "789" > num.txt
[root@web2 project]# git add .
[root@web2 project]# git commit -m "num.txt:789"
[root@web2 project]# git push

2. 查看Git版本信息

[root@web2 project]# git reflog

[root@web2 project]# git log --oneline
04ddc0f num.txt:789
7bba57b num.txt:456
301c090 num.txt:123
b427164 new.txt:third
0584949 new.txt:second
ece2dfd new.txt:first line
e1112ac add new.txt
1a0d908 初始化

3. 移动HEAD指针,将数据还原到任意版本

提示:当前HEAD指针为HEAD@{0}

[root@web2 project]# git reset --hard 301c0   --将指针移动到301c0
[root@web2 project]# git reflog
301c090 HEAD@{
    
    0}: reset: moving to 301c0
04ddc0f HEAD@{
    
    1}: commit: num.txt:789
7bba57b HEAD@{
    
    2}: commit: num.txt:456
301c090 HEAD@{
    
    3}: commit: num.txt:123
b427164 HEAD@{
    
    5}: commit: new.txt:third
0584949 HEAD@{
    
    6}: commit: new.txt:second
ece2dfd HEAD@{
    
    7}: commit: new.txt:first line
e1112ac HEAD@{
    
    8}: commit: add new.txt
1a0d908 HEAD@{
    
    9}: commit (initial): 初始化
[root@web2 project]# cat num.txt				#查看文件是否为123
123
[root@web2 project]# git reset --hard 7bba57b
[root@web2 project]# cat num.txt				#查看文件是否为123,456
123
456

[root@web2 project]# git reflog				#查看指针移动历史
7bba57b HEAD@{
    
    0}: reset: moving to 7bba57b
301c090 HEAD@{
    
    1}: reset: moving to 301c0
… …
[root@web2 project]# git reset --hard 04ddc0f	#回到最后一次修改的版本

Git分支操作

  • Git支持按功能模块、时间、版本等标准创建分支,分支可以让开发分多条主线同时进行,每条主线互不影响,分支效果如图所示:
    在这里插入图片描述

  • 常见的分支规范如下:

MASTER分支(MASTER是主分支,是代码的核心)。

DEVELOP分支(DEVELOP最新开发成果的分支)。

RELEASE分支(为发布新产品设置的分支)。

HOTFIX分支(为了修复软件BUG缺陷的分支)。

FEATURE分支(为开发新功能设置的分支)。

1. 查看并创建分支

[root@web2 project]# git status   --可以看的到当前分支是master
# On branch master
nothing to commit, working directory clean

[root@web2 project]# git branch -v  ---查看分支都有哪些,这里显示只有master,*代表当前在master分支中。
* master 0dc2b76 delete init.txt
[root@web2 project]# git branch hotfix   ---创建分支并命名为hotfix
[root@web2 project]# git branch feature
[root@web2 project]# git branch -v
  feature 0dc2b76 delete init.txt
  hotfix  0dc2b76 delete init.txt
* master  0dc2b76 delete init.txt

2. 切换与合并分支

[root@web2 project]# git checkout hotfix --切换到hotfix分支中
[root@web2 project]# git branch -v
  feature 0dc2b76 delete init.txt
* hotfix  0dc2b76 delete init.txt
master  0dc2b76 delete init.txt
#在分支中添加内容
[root@web2 project]# echo "fix a bug" >> new.txt
[root@web2 project]# git add .
[root@web2 project]# git commit -m "fix a bug
#将hotfix修改的数据合并到master分支。
注意,合并前必须要先切换到master分支,然后再执行merge命令。
[root@web2 project]# git checkout master
[root@web2 project]# cat new.txt		#默认master分支中没有hotfix分支中的数据
[root@web2 project]# git merge hotfix
Updating 0dc2b76..5b4a755
Fast-forward
 new.txt | 1 ++
 1 file changed, 1 insertions(+)

3. 解决版本分支合并的冲突问题

#在不同分支中修改相同文件的相同行数据,模拟数据冲突
[root@web2 project]# git checkout hotfix
[root@web2 project]# echo "AAA" > a.txt  --注意这个a.txt是一个新文件
[root@web2 project]# git add .
[root@web2 project]# git commit -m "add a.txt by hotfix"

[root@web2 project]# git checkout master
[root@web2 project]# echo "BBB" > a.txt   -注意这个a.txt是一个新文件
[root@web2 project]# git add .
[root@web2 project]# git commit -m "add a.txt by master"
[root@web2 project]# git merge hotfix
自动合并 a.txt
冲突(添加/添加):合并冲突于 a.txt
自动合并失败,修正冲突然后提交修正的结果。

#查看有冲突的文件内容,修改文件为最终版本的数据,解决冲突。
[root@web2 project]# cat a.txt				#该文件中包含有冲突的内容
<<<<<<< HEAD
BBB
=======
AAA
>>>>>>> hotfix
[root@web2 project]# vim a.txt              #修改该文件,为最终需要的数据,解决冲突
BBB

[root@web2 project]# git add .
[root@web2 project]# git commit -m "resolved"

Git服务器

  • Git不同服务器形式如下:
  1. SSH协议服务器
  2. Git协议服务器
  3. HTTP协议服务器
  • Git支持很多服务器协议形式,不同协议的Git服务器,客户端就可以使用不同的形式访问服务器。创建的服务器协议有SSH协议、Git协议、HTTP协议

1.SSH协议服务器:(支持读写操作)

#安装git软件包和初始化一个空仓库
[root@localhost ~]# yum  -y install git
[root@localhost ~]# mkdir /var/git
[root@localhost ~]# git init --bare /var/git/base_ssh
Initialized empty Git repository in /var/git/base_ssh/
#客户端访问的方式
[root@web2 ~]# git clone [email protected]:/var/git/base_ssh
#客户端生成SSH密钥,实现免密码登陆git服务器
[root@web2 ~]# ssh-keygen -f /root/.ssh/id_rsa -N ''
[root@web2 ~]# ssh-copy-id  192.168.2.100
[root@web2 ~]# git clone [email protected]:/var/git/base_ssh
[root@web2 ~]# git push

2. Git协议服务器(只读操作的服务器)

#安装git-daemon软件包
[root@localhost ~]# yum -y install git-daemon
#创建版本库
[root@localhost ~]# git init --bare /var/git/base_git
Initialized empty Git repository in /var/git/base_git/
#修改配置文件,启动git服务
[root@localhost ~]# vim /usr/lib/systemd/system/[email protected] 
修改前内容如下:
ExecStart=-/usr/libexec/git-core/git-daemon --base-path=/var/lib/git  --export-all --user-path=public_git --syslog --inetd –verbose
修改后内容如下:
ExecStart=-/usr/libexec/git-core/git-daemon --base-path=/var/git --export-all --user-path=public_git --syslog --inetd –verbose
[root@localhost ~]# systemctl start git.socket
#客户端访问方式:
[root@web2 ~]# git clone git://192.168.20.10/base_git

3.HTTP协议服务器(只读操作的服务器)

#安装软件包gitweb、httpd
[root@localhost ~]# yum -y install httpd gitweb
#修改配置文件,设置仓库根目录
[root@localhost ~]# vim +11 /etc/gitweb.conf
$projectroot = "/var/git";
#创建版本仓库
[root@localhost ~]# git init --bare /var/git/git_httpd
Initialized empty Git repository in /var/git/git_httpd/
#启动httpd服务
[root@localhost ~]# systemctl start httpd.service
  • 客户端访问:
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45625174/article/details/109776487