Git分布式版本控制系统

本文详细介绍了Git分布式版本控制系统,包括Git的安装、基本命令、分支管理和GitLab服务器的使用。Git允许开发者在本地创建分支,进行代码开发,通过GitLab进行版本控制和协同工作。文章还对比了Git与SVN的区别,强调了Git在分布式版本控制中的优势,如分支管理和合并处理的灵活性。此外,还探讨了GitLab的安装、配置以及权限管理,对于企业中的持续集成和代码部署提供了指导。
摘要由CSDN通过智能技术生成
企业高效持续集成平台场景介绍

在这里插入图片描述
开发人员修改完代码上传到git远程本地仓库或gitlab(git私有仓库,大型,有web界面),jenkins拉取gitlab上的代码,第三方程序代码质量管理,能够集成在jenkins上的,自动检测代码的完整性,此测试过程为CI(CI:持续集成、持续构建Continuous Integration)
然后交给测试人员进行集成开发测试(juit单元测试,通过jemeter软件进行测试),测试好后发布,此发布过程为CD(CD持续部署Continuous Deployment、持续交付Continuous Delivery)

maven:是针对Java容器的,Java代码需要许多依赖包,不能单独运行;相当于Linux的yum仓库,针对jar包和war包下载Java的依赖程序。maven自动下载Java的依赖包,并打包成压缩包,再交给jenkins部署。
pom.xml 是maven的配置文件;
CI持续集成、持续构建
CD持续部署、持续交付

DevOps:让开发和运维人员紧密结合;开发:敏捷开发;运维:自动代码集成、自动代码部署、自动代码交付。
集成过程:Git到jenkins,将代码拉取到本地,将代码与部署脚本集成在一起,一起推到远程服务器。
jenkins调用ansible远程服务器执行,配合代码部署脚本覆盖到远程测试服务器上,代码就被部署。
DevOps:开发-----Git-----jenkins提交完成部署的过程
公司环境:
开发与测试之间的配合
Gitlab中存在master主分支,开发经理将master下载下来,创建新的分支为Dev分支,每个开发吧Dev分支下载到本地,每个开发人员再创建个人分支(dev1,dev2,dev3等);当开发人员1完成人物是,会把dev1分支的内容提交到Dev分支,以此类推。
Dev分支具备完整的开发人员编译的代码,开发经理会把Dec分支的代码下载并测试,若未发现问题,把代码再次提交并创建test测试分支,并通知测试人员进行测试(仅有读r权限);若测试时发现问题,反馈给开发经理,联系开发人员,再次拉取Dev分支,提取代码,更改后在push到Dev分支,循环测试过程。
当测试完毕,开始生成前置版本安装包,供用户下载(只有开发经理具有权限,将Dev分支合并到master分支)
jenkins从Gitlab中拉取的代码是测试分支的代码(test分支)
线上环境:(也拥有一支jenkins)
此时的jenkins拉取master分支代码,jenkins上线到web服务器集群;

ansible是在部署时使用:(1)测试环境:换软件版本;(2)上线环境:新增web节点,自动化扩容

GIT分布式版本控制系统
Git简介
  1. Git
    • Git在Wikipedia上的定义:它是一个免费的、分布式的版本控制工具,或是一个强调了速度快的源代码管理工具。Git最初被Linus Torvalds开发出来用于管理Linux内核的开发。每一个Git的工作目录都是一个完全独立的代码库,并拥有完整的历史记录和版本追踪能力,不依赖 于网络和中心服务器。
    • Git的出现减轻了许多开发者和开源项目对于管理分支代码的压力,由于对分支的良好控制,更鼓励开发者对自己感兴趣的项目做出贡献。其实许多开源项目 包括Linux kernel, Samba, X.org Server, Ruby on Rails,都已经过渡到使用Git作为自己的版本控制工具。对于我们这些喜欢写代码的开发者嘛,有两点最大的好处,我们可以在任何地点(在上班的地铁 上)提交自己的代码和查看代码版本;我们可以开许许多多个分支来实践我们的想法,而合并这些分支的开销几乎可以忽略不计。

  2. 版本控制
    (1)本地版本控制系统:
    本地文件上传到本地仓库中,记录版本不同。
    • 许多人习惯用复制整个项目目录的方式来保存不同的版本,或许还会改名加上备份时间以示区别。这么做唯一的好处就是简单。不过坏处也不少:有时候会混淆所在的工作目录,一旦弄错文件丢了数据就没法撤销恢复。
    • 为了解决这个问题,人们很久以前就开发了许多种本地版本控制系统,大多都是采用某种简单的数据库来记录文件的历次更新差异
    在这里插入图片描述
    • 其中最流行的一种叫做 rcs,现今许多计算机系统上都还看得到它的踪影。甚至在流行的 Mac OS X 系统上安装了开发者工具包之后,也可以使用 rcs 命令。它的工作原理基本上就是保存并管理文件补丁(patch)。文件补丁是一种特定格式的文本文件,记录着对应文件修订前后的内容变化。所以,根据每次 修订后的补丁,rcs 可以通过不断打补丁,计算出各个版本的文件内容。
    (2)集中化的版本控制系统:
    多个客户端集中向一个版本仓库进行提交及下载代码。
    • 接下来人们又遇到一个问题,如何让在不同系统上的开发者协同工作?于是,集中化的版本控制系统( Centralized Version Control Systems,简称 CVCS )应运而生。这类系统,诸如 CVS,Subversion 以及 Perforce 等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。多年以来,这 已成为版本控制系统的标准做法
    在这里插入图片描述
    • 这种做法带来了许多好处,特别是相较于老式的本地 VCS来说。现在,每个人都可以在一定程度上看到项目中的其他人正在做些什么。而管理员也可以轻松掌控每个开发者的权限,并且管理一个 CVCS 要远比在各个客户端上维护本地数据库来得轻松容易。
    • 事分两面,有好有坏。这么做最显而易见的缺点是中央服务器的单点故障。如果宕机一小时,那么在这一小时内,谁都无法提交更新,也就无法协同工作。要 是中央服务器的磁盘发生故障,碰巧没做备份,或者备份不够及时,就还是会有丢失数据的风险。最坏的情况是彻底丢失整个项目的所有历史更改记录,而被客户端 提取出来的某些快照数据除外,但这样的话依然是个问题,你不能保证所有的数据都已经有人事先完整提取出来过。本地版本控制系统也存在类似问题,只要整个项 目的历史记录被保存在单一位置,就有丢失所有历史更新记录的风险。
    (3)分布式版本控制系统:
    先把代码上传到本地仓库,再把本地仓库的数据推送到远程仓库。此时,如果远程仓库宕机,还可以将数据推送到本地仓库,不会影响开发的使用。待远程仓库恢复正常,将本地仓库的数据推送到远程仓库即可。
    对于每个用户而言,不同用户的本地仓库间是能沟通的,对A用户的本地仓库来说,B用户的本地仓库就是A用户的远程仓库;本地仓库间可以互推。

    • 于是分布式版本控制系统( Distributed Version Control System,简称 DVCS )面世了。在这类系统中,像 Git,Mercurial,Bazaar 以及 Darcs 等,客户端并不只提取最新版本的文件快照,而是把原始的代码仓库完整地镜像下来。这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。因为每一次的提取操作,实际上都是一次对代码仓库的完整备份
    在这里插入图片描述
    • 更进一步,许多这类系统都可以指定和若干不同的远端代码仓库进行交互。籍此,你就可以在同一个项目中,分别和不同工作小组的人相互协作。你可以根据需要设定不同的协作流程,比如层次模型式的工作流,而这在以前的集中式系统中是无法实现的。

  3. 与同类型版本控制软件:svn,cvs
    SVN 集中式版本控制系统
    GIT 分布式版本控制系统
    Git分布式版本控制系统的优势(相比SVN):
    主仓库与子仓库之间能够连接;子仓库与子仓库之间也能够连接。

在这里插入图片描述
在这里插入图片描述
SVN本地:全量备份主干代码到分支,然后沿着分支一代码继续开发,再copy一份主干代码沿着分支二代码继续开发。
SVN代码服务器对开发的代码的合并处理:将分支中的代码通过覆盖的方式合并到主干代码中,此时,主干代码与分支代码等同。要求分支在同一个主干点上建立,不能交错建立。

Git本地:可以在不同点创建分支;
Git代码服务器对开发的代码的合并处理:如果产生冲突文件会有提示;可以人工介入,能够解决SVN在合并处理时的问题。

实际的例子:
• 以前我所在的小组使用SVN作为版本控制工具,当我正在试图增强一个模块,工作做到一半,由于会改变原模块的行为导致代码服务器上许多测试的失败,所以并没有提交代码。这时候上级对我说,现在有一个很紧急的Bug需要处理, 必须在两个小时内完成。我只好将本地的所有修改diff,并输出成为一个patch文件,然后回滚有关当前任务的所有代码,再开始修改Bug的任务,等到 修改好后,在将patch应用回来。前前后后要完成多个繁琐的步骤,这还不计中间代码发生冲突所要进行的工作量。
• 可是如果使用Git, 我们只需要开一个分支或者转回到主分支上,就可以随时开始Bug修改的任务,完成之后,只要切换到原来的分支就可以优雅的继续以前的任务。只要你愿意,每 一个新的任务都可以开一个分支,完成后,再将它合并到主分支上,轻松而优雅。
• 因此,分布式的版本控制系统,在每个使用者电脑上就有一个完整的数据仓库,没有网络依然可以使用Git。当然为了习惯及团队协作,会将本地数据同步到Git服务器或者GitHub等远程代码仓库
在这里插入图片描述

Git的安装
  1. Windows安装git客户端
    客户端下载地址:https://www.git-scm.com/downloads
    在这里插入图片描述
    双击安装包一路下一步即可。
    在这里插入图片描述
    在桌面上创建一个空目录,右键点击目录
    在这里插入图片描述
    选择Git Bash Here,进入git命令界面
    在这里插入图片描述
    到此windows的git客户端就安装好了
  2. Linux利用yum安装git客户端
#安装环境查看
[root@localhost ~]# cat /etc/redhat-release 
CentOS Linux release 7.5.1804 (Core) 
[root@localhost ~]# uname -r
3.10.0-862.el7.x86_64
#安装git客户端
[root@localhost ~]# yum -y install git
[root@localhost ~]# which git
/usr/bin/git
[root@localhost ~]# git --version
git version 1.8.3.1
#git全局配置
[root@localhost ~]#git config --global user.name "daisy926118"    #配置git使用用户
[root@localhost ~]# git config --global user.email "2914632996@qq.com"		#配置git使用邮箱
[root@localhost ~]# git config --global color.ui true		#语法高亮
[root@localhost ~]# git config --list				#查看全局配置
user.name=daisy926118
user.email=2914632996@qq.com
color.ui=true
#说明:如果没有提前设置Git的全局配置,那么在第一次进行代码提交的时候,会要求输入使用者的邮箱和姓名

到此利用Yum安装Linux操作系统的git客户端就安装好了

  1. Linux源码安装git客户端
    如果我们想要安装最新版本的git,那么就只能源码包安装了
#回退之前的yum安装
[root@localhost ~]# yum history
Loaded plugins: fastestmirror
ID     | Login user               | Date and time    | Action(s)      | Altered
-------------------------------------------------------------------------------
     5 | root <root>              | 2018-12-19 05:01 | Install        |    4   
     4 | root <root>              | 2018-12-18 09:11 | Install        |    9   
     3 | root <root>              | 2018-12-18 09:09 | I, U           |  100 EE
     2 | root <root>              | 2018-12-18 09:07 | Install        |    1   
     1 | System <unset>           | 2018-12-18 08:50 | Install        |  313   
history list
[root@localhost ~]# yum history undo 5
#源码安装git-2.9.5.tar.gz
[root@localhost ~]# ls
anaconda-ks.cfg  git-2.9.5.tar.gz
[root@localhost ~]# yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
[root@localhost ~]# yum -y install gcc perl-ExtUtils-MakeMaker
[root@localhost ~]# tar xf git-2.9.5.tar.gz -C /usr/src/
[root@localhost ~]# cd /usr/src/git-2.9.5/
[root@localhost git-2.9.5]# ./configure --prefix=/usr/local/git
[root@localhost git-2.9.5]# make && make install
[root@localhost git-2.9.5]# ln -sf /usr/local/git/bin/* /usr/bin/
[root@localhost git-2.9.5]# which git
/usr/bin/git
#源码编译需要链接git的命令库
[root@localhost git-2.9.5]# ln -s /usr/libexec/git-core/* /usr/bin/
[root@localhost git-2.9.5]# git --version
git version 2.9.5

Git的命令入门

• 工作区
建立的本地git项目目录
• 暂存区
将工作区里的变更部分(与上一版本不同的部分)暂时存储起来的地方
• 本地仓库
在本地创建的git版本仓库,用于提交工作区的变更。
• 远程仓库
githab,gitlab或者队友机器上所建立的一个仓库
在这里插入图片描述

主机名 IP 备注
Git01 192.168.238.136 git测试客户端一
Git02 192.168.238.135 git测试客户端二
  1. git帮助文档
[root@localhost bin]# git
usage: git [--version] [--help] [-C <path>] [-c name=value]
           [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
           [-p | --paginate | --no-pager] [--no-replace-objects] [--bare]
           [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
           <command> [<args>]

These are common Git commands used in various situations:

start a working area (see also: git help tutorial)
   clone      Clone a repository into a new directory
   init       Create an empty Git repository or reinitialize an existing one

work on the current change (see also: git help everyday)
   add        Add file contents to the index
   mv         Move or rename a file, a directory, or a symlink
   reset      Reset current HEAD to the specified state
   rm         Remove files from the working tree and from the index

examine the history and state (see also: git help revisions)
   bisect     Use binary search to find the commit that introduced a bug
   grep       Print lines matching a pattern
   log        Show commit logs
   show       Show various types of objects
   status     Show the working tree status

grow, mark and tweak your common history
   branch     List, create, or delete branches
   checkout   Switch branches or restore working tree files
   commit     Record changes to the repository
   diff       Show changes between commits, commit and working tree, etc
   merge      Join two or more development histories together
   rebase     Reapply commits on top of another base tip
   tag        Create, list, delete or verify a tag object signed with GPG

collaborate (see also: git help workflows)
   fetch      Download objects and refs from another repository
   pull       Fetch from and integrate with another repository or a local branch
   push       Update remote refs along with associated objects

'git help -a' and 'git help -g' list available subcommands and some
concept guides. See 'git help <command>' or 'git help <concept>'
to read about a specific subcommand or concept.

  1. git init初始化GIT工作目录
#在Linux上
[root@localhost bin]# mkdir -p /mycode
[root@localhost bin]#  cd /mycode
[root@localhost mycode]# git init
Initialized empty Git repository in /mycode/.git/
[root@localhost mycode]# ls -la
total 0
drwxr-xr-x.  3 root root  18 Dec 19 08:27 .
dr-xr-xr-x. 18 root root 238 Dec 19 08:27 ..
drwxr-xr-x.  7 root root 119 Dec 19 08:27 .git

  1. git add将变更添加进入暂存区
    在这里插入图片描述
#在Linux上
[root@localhost mycode]# touch test.txt
[root@localhost mycode]# git add test.txt 
#查看git工作目录的暂存区状态
[root@localhost mycode]# git status
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

	new file:   test.txt

  1. git commit将变更从暂存区提交到本地仓库
#在linux上
[root@localhost mycode]# git commit -m "test.txt"
[master (root-commit) b0ffa8e] test.txt
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 test.txt

  1. 创建github账号,并创建个人github远程仓库
    在这里插入图片描述
    创建完github账号后,我们就可以创建远程仓库了,如下图所示:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  2. git remote用于管理远程仓库
    (1)git remote add
    添加一个远程仓库的URL
    命令格式:git remote add <仓库的名字> <仓库的URL>
#在Linux上
[root@localhost mycode]# git remote add test1 https://github.com/daisy926118/yunjisuan.git

(2)显示所有远程仓库
命令格式:git remote -v
(3)删除指定远程仓库
命令格式:git remote rm <仓库的名字>

  1. git push将本地仓库的变更推送到远程仓库的某个分支
    命令格式:
    git push -u <远程仓库的名字> <远程仓库的某一分支名字>
#在Linux上推送本地仓库变更到远程仓库的master分支
[root@localhost mycode]# git push -u test1 master
Username for 'https://github.com': daisy926118      #Username
Password for 'https://daisy926118@github.com':    #创建用户时的Password
Counting objects: 3, done.
Writing objects: 100% (3/3), 199 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/daisy926118/yunjisuan.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from test1.

再次在浏览器进行访问查看你的github地址
在这里插入图片描述

  1. git clone克隆一个现有仓库到本地
    我们在另一台Git02上来模拟其他客户端进行对远程仓库克隆到本地仓库的操作
#Git02端
[root@localhost ~]# yum -y install git
[root@localhost ~]# mkdir -p /mycode2
[root@local
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值