第1章Git分布式版本控制系统

Posted oldxulinux

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第1章Git分布式版本控制系统相关的知识,希望对你有一定的参考价值。

 

笔者QQ572891887

Linux架构交流群:471443208

1.1Git诞生历史

我想大家还记得Linus torvalds1991年时发布了Linux操作系统吧,从那以后Linux系统变不断发展壮大,因为Linux系统开源的特性,所以一直接受着来自全球Linux技术爱好者的贡献,志愿者们通过邮件向Linus发送着自己编写的源代码文件,然后由Linus本人通过手工的方式将代码合并,但这样不仅没有效率,而且真的是太痛苦了。
一直到2002年,Linux系统经过十余年的不断发展,代码库已经庞大到无法再让Linus通过手工的方式管理了,但是Linus真的很不喜欢CVS或者Subversion版本控制系统,于是商业公司BitMover决定将其公司的BitKeeper分布式版本控制系统授权给Linux开发社区来免费使用,当时的BitKeeper可以比较文件内容的不同,还能够将出错的文档还原到历史某个状态,Linus终于放下了心里的石头。

说明: Git分布式版本控制流程图

分布式版本控制流程图

CVSSubversion属于传统的版本控制系统,而分布式版本控制系统最大的特点是不需要每次提交都把文件推送到版本控制服务器,而是采用分布式版本库的机制,使得每个开发人员都够从服务器中克隆一份完整的版本库到自己计算机本地,不必再完全依赖于版本控制服务器,使得源代码的发布和合并更加方便,并且因为数据都在自己本地,不仅效率提高了,而且即便我们离开了网络依然可以执行提交文件、查看历史版本记录、创建分支等等操作,真的是开发者的福音啊。

就这样平静的度过了三年时间,但是Linux社区聚集着太多的黑客人物,2005年时,那位曾经开发Samba服务程序的Andrew因为试图破解BitKeeper软件协议而激怒了BitMover公司,当即决定不再向Linux社区提供免费的软件授权了,此时的Linus其实也早已有自己编写分布式版本控制系统的打算了,于是便用C语言花了2周创建了Git分布式版本控制系统,并上传了Linux系统的源代码。

说明: git

git_logo

Git不仅是一款开源的分布式版本控制系统,而且有其独特的功能特性,例如大多数的分布式版本控制系统只会记录每次文件的变化,说白了就是只会关心文件的内容变化差异,而Git则是关注于文件数据整体的变化,直接会将文件提交时的数据保存成快照,而非仅记录差异内容,并且使用SHA-1加密算法保证数据的完整性。

Git为了提高效率,对于没有被修改的文件,则不会重复存储,而是创建一个链接指向之前存储过的文件。

说明: Git提交流程图

git提交流程图

在正式使用前,我们还需要弄清楚Git的三种重要模式,分别是已提交、已修改、已暂存

已提交(committed):表示数据文件已经顺利提交到Git数据库中。

已修改(modified):表示数据文件已经被修改,但未被保存到Git数据库中。

已暂存(staged):表示数据文件已经被修改,并会在下次提交时提交到Git数据库中。

提交前的数据文件可能会被随意修改或丢失,但只要把文件快照顺利提交到Git数据库中,那就可以完全放心了,流程为:

1.在工作目录中修改数据文件。

2.将文件的快照放入暂存区域。

3.将暂存区域的文件快照提交到Git仓库中。

说明: Git的三种工作状态

git工作模式

1.2Git环境准备

[root@git-node1 ~]# cat /etc/redhat-release   #查看系统版本

CentOS Linux release 7.1.1503 (Core)

[root@git-node1 ~]# uname -r  #查看内核版本

3.10.0-229.el7.x86_64

[root@git-node1 ~]# getenforce  #确认Selinux关闭状态

Disabled

[root@git-node1 ~]# systemctl stop firewalld  #关闭防火墙

[root@git-node1 ~]# ifconfig eth0|awk -F \'[ ]+\' \'NR==2{print $3}\'  #查看当前主机IP地址

192.168.56.115

1.3Git安装部署

Git是分布式的版本控制系统,我们只要有了一个原始Git版本仓库,就可以让其他主机克隆走这个原始版本仓库,从而使得一个Git版本仓库可以被同时分布到不同的主机之上,并且每台主机的版本库都是一样的,没有主次之分,极大的保证了数据安全性,并使得用户能够自主选择向那个Git服务器推送文件了,其实部署一个git服务器是非常简单的。

[root@git-node1 ~]# yum install git  #安装Git

[root@git-node1 ~]# git config --global user.name "xubusi"  #配置git使用用户

[root@git-node1 ~]# git config --global user.email "xubusi@mail.com"  #配置git使用邮箱

[root@git-node1 ~]# git config --global color.ui true

 

[root@git-node1 ~]# git config --list

user.name=xubusi

user.email=xubusi@mail.com

color.ui=true

1.4Git常用命令

   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 对象

1.5Git基本操作

1.5.1Git提交数据

我们可以简单的把工作目录理解成是一个被Git服务程序管理的目录,Git会时刻的追踪目录内文件的改动,另外在安装好了Git服务程序后,默认就会创建好了一个叫做master的分支,我们直接可以提交数据到了

[root@git-node1 ~]# mkdir xubusi  #创建本地工作目录

[root@git-node1 ~]# cd xubusi/     #进入本地工作目录

[root@git-node1 xubusi]# git init  #初始为git工作目录

Initialized empty Git repository in /root/xubusi/.git/

[root@git-node1 xubusi]# touch readme #创建文件

 

[root@git-node1 xubusi]# git status  #查看git状态

# Untracked files:

#   (use "git add <file>..." to include in what will be committed)

#       readme.txt  #发现新建的readme.txt文件

 

 

[root@git-node1 xubusi]# git add readme.txt  #git添加文件至暂存区

[root@git-node1 xubusi]# git status  #再次查看状态

# Changes to be committed:

#   (use "git rm --cached <file>..." to unstage)

#       new file:   readme.txt#发现新建立的文件readme.txt已经变绿

 

[root@git-node1 xubusi]# git commit -m "the first commit"  #git cmmit提交暂存取文件至git版本仓库

[master (root-commit) dde9e40] the first commit

 1 file changed, 1 insertion(+)

 create mode 100644 readme.txt

1.5.2Git移除数据

有些时候会向把已经添加到暂存区的文件移除,但仍然希望文件在工作目录中不丢失,换句话说,就是把文件从追踪清单中删除。

[root@git-node1 xubusi]# touch database  #建立文件

[root@git-node1 xubusi]# git add database   #添加文件至暂存区

[root@git-node1 xubusi]# git status  #查看当前git状态

# On branch master

# Your branch is ahead of \'origin/master\' by 4 commits.

#   (use "git push" to publish your local commits)

#

# Changes to be committed:

#   (use "git reset HEAD <file>..." to unstage)

#

#       new file:   database

[root@git-node1 xubusi]# git rm --cached database  #将文件从git暂存区域的追踪列表移除(并不会删除当前工作目录内的数据文件)

rm \'database\'

[root@git-node1 xubusi]# git status  #此时文件已经是未追踪状态了

# On branch master

# Untracked files:

#   (use "git add <file>..." to include in what will be committed)

#

#       database

no changes added to commit (use "git add" and/or "git commit -a")

#如果想将文件数据从git暂存区和工作目录一起删除,可以做如下操作。

[root@git-node1 xubusi]# git add database  #再将database文件提交到git暂存区

[root@git-node1 xubusi]# git rm -f database  #但如果在删除之前数据文件已经被放入到暂存区域的话,git会担心你误删未提交的文件而报错信息,此时可追加强制删除-f参数。

rm \'database\'

[root@git-node1 xubusi]# ls  #查看工作区也没database文件

LICENSE  deployhelp.md  readme.txt

[root@git-node1 xubusi]# git status  #查看当前状态

# On branch master

no changes added to commit (use "git add" and/or "git commit -a")

1.5.3Git移动数据

[root@git-node1 xubusi]# git mv readme.txt test.txt  #git如果要修改文件名称,则使用git mv命令

[root@git-node1 xubusi]# git status  #查看状态发现下次提交会有一个改名操作

# On branch master

# Changes to be committed:

#   (use "git reset HEAD <file>..." to unstage)

#

#       renamed:    readme.txt -> test.txt

[root@git-node1 xubusi]# git commit -m "changed name"  #提交到git版本仓库

[master 88f3791] changed name

 2 files changed, 31 deletions(-)

 delete mode 100644 1

 rename readme.txt => test.txt (100%)

 

#其实可以如下方法改名

[root@git-node1 xubusi]# mv test.txt readme.txt  #先修改名称

[root@git-node1 xubusi]# git rm test.txt  #然后删除git版本仓库内的文件快照

rm \'test.txt\'

[root@git-node1 xubusi]# git add readme.txt  #最后再将新的文件添加进入

[root@git-node1 xubusi]# git commit -m "changed the file name"  #提交至git版本仓库

[master 2caa209] changed the file name

 1 file changed, 0 insertions(+), 0 deletions(-)

 rename test.txt => readme.txt (100%)

1.5.4Git历史记录