一、Git分布式版本控制系统

一、引入

在开发一个软件项目时,本地只有几十行代码或几百行代码时还可以维护,但当代码达到一定的数量后或两三个人共同开发一个项目时,就很容易会出现代码混乱、冲突、排错难等问题。一旦开发完工以后发现整个项目运行不了,提交的代码也无法确认到责任人,导致维护项目时需要花费数倍的时间。为解决上述问题,版本控制系统应运而生。

版本控制是指对软件开发过程中各种程序代码、配置文件及说明文档等文件变更的管 理,是软件配置管理的核心思想之一。

二、版本控制系统

2.1、本地版本控制

本地版本控制系统许多人习惯用复制整个项目目录的方式来保存不同的版本,或许还会改名加上备份时间以示区别。这么做唯一的 好处就是简单,但是特别容易犯错。有时候会混淆所在的工作目录,一不小心会写错文件或者覆盖意想外的文件,无法识别文件中的修改。

2.2、集中化的版本控制系统

如何让处于不同系统上的开发者协同工作?于是,集中化的版本控制系统(Centralized Version  Control Systems,简称 CVCS)应运而生。这类系统,诸如 CVS、Subversion(SVN) 以及Perforce 等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。多年以来,这已成为版本控制系统的标准做法。

 

2.3、分布式版本控制系统

 在这类系统中,像Git、Mercurial、Bazaar 以及 Darcs 等,客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像(克隆)下来。这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。因为每一次的克隆操作,实际上都是一次对代码仓库的完整备份。

 三、Git介绍

 

 官网:https://git-scm.com
 官方中文手册: https://git-scm.com/book/zh/v2

git是一个分布式版本控制软件,最初由林纳斯·托瓦兹(Linus Torvalds)创作,于2005年以GPL发布。最初目的是为更好地管理Linux内核开发而设计。

 

3.1、Git发展史

自2002年开始,林纳斯·托瓦兹决定使用BitKeeper作为Linux内核主要的版本控制系统用以维护代码。因为BitKeeper为专有软件,这个决定在社区中长期遭受质疑。在Linux社区中,特别是理查德·斯托曼与自由软件基金会的成员,主张应该使用开放源代码的软件来作为Linux核心的版本控制系统。林纳斯·托瓦兹曾考虑过采用现成软件作为版本控制系统(例如Monotone),但这些软件都存在一些问题,特别是性能不佳。现成的方案,如CVS的架构,受到林纳斯·托瓦兹的批评。

2005年,安德鲁·垂鸠写了一个简单程序,可以连接BitKeeper的存储库,BitKeeper著作权拥有者拉里·麦沃伊认为安德鲁·垂鸠对BitKeeper内部使用的协议进行逆向工程,决定收回无偿使用BitKeeper的授权。Linux内核开发团队与BitMover公司进行蹉商,但无法解决他们之间的歧见。林纳斯·托瓦兹决定自行开发版本控制系统替代BitKeeper,以十天的时间,编写出第一个git版本。

Git 是一个开源的分布式版本控制系统,用以有效、高速的处理从很小到非常大的项目版本管理。一个原始 Git 版本仓库,可以让其他主机克隆这个原始版本仓库,从而使得一个Git 版本仓库可以同时分布到不同的主机上,并且每台主机的版本库都是一样的,并没有主次之分,极大的保证了数据的安全性,并使得用户能够自主选择 Git 服务器推送文件了,其实部署一个 Git 服务器是一件非常简单的事情。

如上所述,作为一个分布式的版本控制系统,在 Git 中并不存在主库这样的概念。每一 份复制出的库都可以独立使用,任何两个库之间的不一致之处都可以进行合并。

 GitHub 是一个面向开源及私有软件项目的托管平台,因为只支持 Git 作为唯一的版本库格式进行托管,故名 GitHub。GitHub 可以提供给用户空间创建 Git 仓储,保存用户的一些数据文档或者代码等。

GitHub 作为开源代码库以及版本控制系统,目前拥有 140 多万开发者用户。随着越多的应用程序转移到了云上,GitHub 已经成为了管理软件开发以及发现已有代码的首选方法。

GitHub 可以托管各种 Git 库,并提供一个 Web 界面,但与其它像 SourceForge 或 Google Code 这样的服务不同,GitHub 的独特卖点在于从另外一个项目进行分支的简易性。为一个项目贡献代码非常简单:首先点击项目站点的“fork”的按钮,然后将代码检出并将修改加入到刚才分出的代码库中,最后通过内建的“pull request”机制向项目负责人申请代码合并。

Gitlab 是一个基于 Git 的项目管理软件,用于仓库管理系统的开源项目。使用 Git 作为代码管理工具,并在此基础上搭建起来 Web 服务。

Git、Gitlab、Github 都是基于 Git 的,可以说是 Git 的衍生品。

3.2、Git功能特性

  1. 克隆数据库版本:从服务器上克隆数据库(包括代码和版本信息)到本机上;
  2. 提交代码:在本机上自己创建的分支上提交代码;
  3. 合并分支:在本机上合并分支;
  4. 拉取合并分支:新建一个分支,把服务器上最新版的代码 Fetch 下来,然后跟自己的主分支合并;
  5. 代码冲突解决:一般开发者之间解决冲突的方法,开发者之间可以使用 pull 命令解决冲突,解决完冲突之后再向主开发者提交补丁。

3.3、Git的工作原理

 

 上面这幅图很好的解释了Git的工作原理:

 

工作区:clone的代码或者开发自己编写的代码文件所在的目录,通常是代码所在的一个服务的目录。

暂存区:用于存储在工作区中对代码进行修改后的文件所保存的地方,使用 git add . 添加到暂存区

本地仓库:用于存储在工作区和暂存区中改过的文件地方,使用git commit 进行提交

远程仓库:多个开发共同提交代码的仓库,即gitlab服务器。

 

四、案例环境

服务器 IP地址 主机名 角色
 centos7.x  192.168.100.111  gitserver  git服务器
  centos7.x  192.168.100.112  git  git客户端

案例一:部署Git

第一步:

初始化环境

[root@gitclient ~]# systemctl stop firewalld
[root@gitclient ~]# iptables -F
[root@gitclient ~]# setenforce 0

第二步:(临时使用)

Centos自带git

[root@gitclient ~]# rpm -q git
git-1.8.3.1-23.el7_8.x86_64

安装方法

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

第三步:(推荐使用)

Git下载地址: https://github.com/git/git/releases

 

 

 安装依赖

[root@gitclient ~]# yum -y install curl-devel expat-devel gettext-devel  openssl-devel zlib-devel

编译安装

[root@gitclient ~]# wget https://github.com/git/git/archive/v2.22.0.tar.gz
[root@gitclient ~]# tar xf git-2.22.0.tar.gz -C /usr/src/
[root@gitclient ~]# cd /usr/src/git-2.22.0/
[root@git git-2.22.0]# make configure
[root@git git-2.22.0]# ./configure --prefix=/usr/local/git && make && make install
[root@git git-2.22.0]# ln -sf /usr/local/git/bin/git /usr/bin/
[root@git git-2.22.0]# git --version           # 这里就安装完成了
git version 2.22.0

 第四步:

[root@gitclient ~]# git config --global user.name "crushlinux"  #配置git使用用户
[root@gitclient ~]# git config --global user.email "crushlinux@163.com"  #配置git使用邮箱
[root@gitclient ~]# git config --global color.ui true  #语法高亮
[root@gitclient ~]# git config --list #查看全局配置
user.name=crushlinux
user.email=crushlinux@163.com
color.ui=true

  

 4、初始化及获取 Git 仓库

Git服务器操作

[root@gitserver ~]# mkdir git_data.git
[root@gitserver ~]# cd git_data.git/
[root@gitserver git_data.git]# git --bare init
初始化空的 Git 版本库于 /root/git_data.git/

Git客户端操作

[root@gitclient ~]# ssh-keygen
[root@gitclient ~]# ssh-copy-id 192.168.200.111
[root@gitclient ~]# git clone root@192.168.200.111:/root/git_data.git
正克隆到 'git_data'...
warning: 您似乎克隆了一个空仓库。
[root@gitclient ~]# cd git_data/
[root@git git_data]# git status
位于分支 master

尚无提交

无文件要提交(创建/拷贝文件并使用 "git add" 建立跟踪)

 

案例二:部署win10 的git客户端

软件包下载:https://git-scm.com/downloads

 

访问以上网站:(选择windows)

 

 

 

 下载好之后,安装就默认下一步

 

 这样我们把代码克隆下来

 

测试提交:

 

 配置好邮箱后,我们再次提交就OK了

 

 查看更新

 这里就是举个例子,公司的话不会写的这么简单(最后提交)

 案例三:Git相关命令使用场景

1. Git命令常规操作

 

命令

命令说明

add    

添加文件内容至暂存区(索引)

bisect 

通过二分查找定位引入 bug 的变更

branch 

列出、创建或删除分支

checkout

检出一个分支或路径到工作区

clone  

克隆一个版本库到一个新目录

commit 

记录变更到版本库(本地)

diff   

显示提交之间、提交和工作区之间等的差异

fetch  

从另外一个版本库下载对象和引用

grep   

输出和模式匹配的行

init   

创建一个空的

Git    

版本库或重新初始化一个已存在的版本库

log    

显示提交日志

merge  

合并两个或更多开发历史

mv     

移动或重命名一个文件、目录或符号链接

pull   

获取并合并另外的版本库或一个本地分支

push   

更新远程引用和相关的对象

rebase 

本地提交转移至更新后的上游分支中

reset  

重置当前HEAD到指定状态

rm     

从工作区和索引中删除文件

show   

显示各种类型的对象

status 

显示工作区状态

tag

创建、列出、删除或校验一个GPG签名的 tag 对象

 2. 常用配置

git config --global user.name "admin"                   #配置git使用用户
git config --global user.email admin@163.com	        #配置git使用邮箱
git config --global color.ui true		                #语法高亮
git config --list		                                #查看全局配置

git add .   # 添加文件到暂存区
git commit -m "111"       # 提交到本地仓库
git status                # 查看工作区的状态
git push          # 推送到远程仓库(即gitlab服务器)
git pull          # 获取最新的代码到本地(克隆的成本比较高,一般选择git pull来只获取没有的那部分)
git log          # 查看操作日志
git reset --hard 版本ID号   # 回退到指定id的版本
git branch		# 查看当前所在分支
git checkout -b dev  # 创建dev分支,并切换
git checkout dev     # 切换到dev分支

  

  

 

posted @ 2021-09-05 19:03  被遗忘的记忆  阅读(544)  评论(0编辑  收藏  举报