一、Git介绍

Git(读音为/gɪt/。)是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,所以,工作的时候就不需要联网了,因为版本库都是在自己的电脑 上。现在每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。

主要有如下特点:

1. 版本控制(可以根据需要随意切换到任何版本)

2. 分布式

3. 工作过程是将服务器上的代码下载到本地,本地开发完成后,在提交到服务器端

git相比于svn功能更加的强大,命令也很多。本篇博客将详细介绍一些常用命令的使用操作。

二、GitSVN的对比

1. git是分布式的,svn是集中式的。(最核心)

2. git是每个历史版本都存储完整的文件,便于恢复,svn是存储差异文件,历史版本不可恢复。(核心)

3. git可离线完成大部分操作,svn则不能。

4. git有着更优雅的分支和合并实现。

5. git有着更强的撤销修改和修改历史版本的能力

6. git速度更快,效率更高。

基于以上区别,git有了很明显的优势,特别在于它具有的本地仓库。

三、Git几个概念

1、工作目录

工作目录是对项目的某个版本独立提取出来的内容。这些从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。

2、暂存区域

是一个文件,保存了下次将提交的文件列表信息,一般在 Git 仓库目录中。有时候也被称作`‘索引’',不过一般说法还是叫暂存区域。

3、Git 仓库目录

是Git 用来保存项目的元数据和对象数据库的地方。这是 Git 中最重要的部分,从其它计算机克隆仓库时,拷贝的就是这里的数据。

四、Git工作流程

基本的 Git 工作流程如下:

在工作目录中修改文件 > 暂存文件,将文件的快照放入暂存区域 > 提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。

如果 Git 目录中保存着的特定版本文件,就属于已提交状态。如果作了修改并已放入暂存区域,就属于已暂存状态。如果自上次取出后,作了修改但还没有放到暂存区域,就是已修改状态。

五、Git的安装

第一种安装方式:yum进行安装

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

第二种安装方式:编译安装

第一步:上传安装包并解压

[root@ren ~]# rz

[root@ren ~]# ls | grep git

git-v2.7.4.zip

[root@ren ~]# unzip git-v2.7.4.zip

第二步:安装依赖

[root@ren git-2.7.4]# yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker -y

第三步:进入解压下目录下并执行编译

[root@ren git-2.7.4]# make prefix=/usr/local/git all

[root@ren git-2.7.4]# make prefix=/usr/local/git install

第四步:导入二进制程序

[root@ren git-2.7.4]# rm -rf /usr/bin/git

[root@ren git-2.7.4]# ln -s /usr/local/git/bin/git /usr/bin/git

[root@ren git-2.7.4]# git --version

git version 2.7.4

六、git常用选项

add 把工作目录中的内容添加到暂存区域

branch 查看和创建分支

checkout 切换分支和撤销(暂存区域的版本回滚)

clone 克隆远程仓库

commit 把暂存区域的内容提交到仓库

init 初始化工作目录(初始化完成会生成一个隐藏目录.git)

log 查看版本提交信息(日志)

merge 合并分支内容

pull 拉取远程仓库

push 把本地内容推送到远程仓库

reset 撤销操作(重置)(仓库的版本回滚)

status 查看当前文件所处的状态

reflog 查看所有版本commitID

七、Git使用演示

第一步:创建和初始化git工作目录

[root@ren5 ~]# mkdir /ren            #创建工作目录

[root@ren5 ~]# cd /ren

[root@ren5 ren]# git init         #初始化工作目录

初始化空的 Git 版本库于 /ren/.git/

[root@ren5 ren]# ls -a

.  ..  .git

第二步:创建文件进行测试

[root@ren5 ren]# echo "123123123" > test        #创建测试文本

[root@ren5 ren]# ls

test

[root@ren5 ren]# git add .             #把工作目录下的所有文件提交到暂存区域

[root@ren5 ren]# git commit -m "version1"      #把暂存区域的内容提交到仓库并标识为version1版本(-m为message)

[root@ren5 ren]# git config --global user.email "you@example.com"       #根据提示进行认证

[root@ren5 ren]# git config --global user.name "Your Name"

[root@ren5 ren]# git commit -m "version1"      #再次进行提交

[master(根提交) 07cc74c] version1

1 file changed, 1 insertion(+)

create mode 100644 test

第三步:查看版本信息

[root@ren5 ren]# git log

commit 07cc74cca27f37439bdbd9551559156a5135ebb6

Author: Your Name <you@example.com>

Date:   Fri Aug 16 18:54:39 2019 +0800

version1

第四步:再次提交不同内容

[root@ren5 ren]# echo "456456" >> test

[root@ren5 ren]# git add .

[root@ren5 ren]# git commit -m "version2"

[master 5290ec9] version2

1 file changed, 1 insertion(+)

[root@ren5 ren]# echo "789789" >> test

[root@ren5 ren]# git add .

[root@ren5 ren]# git commit -m "version3"

[master 5651405] version3

1 file changed, 1 insertion(+)

[root@ren5 ren]# git log

commit 5651405f5af1a8663e90cb09d342393e8b3d1cda

Author: Your Name <you@example.com>

Date:   Fri Aug 16 19:04:35 2019 +0800

version3

commit 5290ec95b3f66981c0e9944db246caa2e79490ef

Author: Your Name <you@example.com>

Date:   Fri Aug 16 19:04:05 2019 +0800

version2

commit 07cc74cca27f37439bdbd9551559156a5135ebb6

Author: Your Name <you@example.com>

Date:   Fri Aug 16 18:54:39 2019 +0800

version1

第五步:切换至test及version1版本

[root@ren5 ren]# cat test        #现在位于version3版本

123123123

456456

789789

[root@ren5 ren]# git reset --hard 07cc74cca27f37439            #切换至版本1,hard后面的是版本1的commit的值(可以复制一部分)

HEAD 现在位于 07cc74c version1

[root@ren5 ren]# cat test        #已切换至版本1

123123123

[root@ren5 ren]# git log

commit 07cc74cca27f37439bdbd9551559156a5135ebb6

Author: Your Name <you@example.com>

Date:   Fri Aug 16 18:54:39 2019 +0800

version1

第六步:恢复至版本2(version2

[root@ren5 ren]# git reflog            #首先使用git reflog可以查看commit值(reflog回流)

07cc74c HEAD@{0}: reset: moving to 07cc74cca27f37439

5651405 HEAD@{1}: commit: version3

5290ec9 HEAD@{2}: commit: version2

07cc74c HEAD@{3}: commit (initial): version1

[root@ren5 ren]# git reset --hard 5290ec9         #恢复的时候指定conmit值

HEAD 现在位于 5290ec9 version2

[root@ren5 ren]# git log         #查看发现已经恢复到v2版本

commit 5290ec95b3f66981c0e9944db246caa2e79490ef

Author: Your Name <you@example.com>

Date:   Fri Aug 16 19:04:05 2019 +0800

version2

commit 07cc74cca27f37439bdbd9551559156a5135ebb6

Author: Your Name <you@example.com>

Date:   Fri Aug 16 18:54:39 2019 +0800

version1

[root@ren5 ren]# cat test

123123123

456456

八、不同阶段的回滚(撤销)

1、工作目录回滚

[root@ren5 ren]# cat test

123123123

[root@ren5 ren]# git log         #目前处于版本1

commit 07cc74cca27f37439bdbd9551559156a5135ebb6

Author: Your Name <you@example.com>

Date:   Fri Aug 16 18:54:39 2019 +0800

version1

[root@ren5 ren]# echo "你好,GIT" >> test            #写入内容

[root@ren5 ren]# git status            #查看文件状态

# 位于分支 master

# 尚未暂存以备提交的变更:

#   (使用 "git add <file>..." 更新要提交的内容)

#   (使用 "git checkout -- <file>..." 丢弃工作区的改动)

#    修改:      test

修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

[root@ren5 ren]# git checkout -- test           #进行工作目录状态撤销

[root@ren5 ren]# cat test               #再次查看文本发现写入内容已经没有

123123123

2、暂存区域回滚

[root@ren5 ren]# echo "你好,GIT" >> test            #写入内容

[root@ren5 ren]# git add .             #提交至暂存区域

[root@ren5 ren]# git status            #查看文件状态

# 位于分支 master

# 要提交的变更:

#   (使用 "git reset HEAD <file>..." 撤出暂存区)

#    修改:      test

[root@ren5 ren]# git reset HEAD test                #不提交至仓库

重置后撤出暂存区的变更:

M   test

[root@ren5 ren]# git status            #文件被退回到工作目录中

# 位于分支 master

# 尚未暂存以备提交的变更:

#   (使用 "git add <file>..." 更新要提交的内容)

#   (使用 "git checkout -- <file>..." 丢弃工作区的改动)

#    修改:      test

修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

[root@ren5 ren]# git checkout -- test                  #从工作目录中撤销

[root@ren5 ren]# cat test

123123123

3、版本管理

我们知道回退版本需要用到commit值但是现在通过git log已经看不到v4的commit值了,现在怎么办呐?

可以通过git reflog查看所有的历史操作找到v4前面的值即可

九、Git分支

几乎所有的版本控制系统都以某种形式支持分支。使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线。

Git 处理分支的方式可谓是难以置信的轻量,创建新分支这一操作几乎能在瞬间完成,并且在不同分支之间的切换操作也是一样便捷。与许多其它版本控制系统不同,Git 鼓励在工作流程中频繁地使用分支与合并,哪怕一天之内进行许多次。

第一步:查看分支

[root@ren5 ren]# git branch

* master              # *表示当前所处的分支位置(在提交过文件之后才会有分支)

第二步:创建新分支

[root@ren5 ren]# git branch ren

[root@ren5 ren]# git branch

* master

ren

第三步:切换分支

[root@ren5 ren]# git checkout ren

切换到分支 'ren'

[root@ren5 ren]# git branch

master

* ren

第四步:写入内容至文件并提交(必须提交)

[root@ren5 ren]# echo "hello,hello" >> test

[root@ren5 ren]# git add .

[root@ren5 ren]# git commit -m "version4"

[ren ec98de6] version4

1 file changed, 1 insertion(+)

[root@ren5 ren]# cat test

123123123

456456

789789

hello,hello

第五步:切换至主分支

[root@ren5 ren]# git checkout master

切换到分支 'master'

[root@ren5 ren]# git branch

* master

ren

[root@ren5 ren]# cat test        #查看文件内容,并没有子分支刚才提交的内容

123123123

[root@ren5 ren]# git log

commit 07cc74cca27f37439bdbd9551559156a5135ebb6

Author: Your Name <you@example.com>

Date:   Fri Aug 16 18:54:39 2019 +0800

version1

第六步:合并分支(合并的是各个分支的内容)

[root@ren5 ren]# git merge ren  (默认会将merge后跟的分支合并到当前所处的分支下)

更新 07cc74c..ec98de6

Fast-forward

test | 3 +++

1 file changed, 3 insertions(+)

[root@ren5 ren]# cat test        #合并之后发现现在主分支也可以看到刚才子分支添加的内容了

123123123

456456

789789

hello,hello

[root@ren5 ren]# git log

commit ec98de6da776dfedfd7c2baf05388bfe26906c2d

Author: Your Name <you@example.com>

Date:   Fri Aug 16 20:13:43 2019 +0800

version4

Linux进阶之Git分布式版本控制系统篇的更多相关文章

  1. g4e基础篇#2 Git分布式版本控制系统的优势

    g4e 是 Git for Enterprise Developer的简写,这个系列文章会统一使用g4e作为标识,便于大家查看和搜索. 章节目录 前言 1. 基础篇: 为什么要使用版本控制系统 Git ...

  2. 《Linux就该这么学》自学笔记_ch21_使用Git分布式版本控制系统

    <Linux就该这么学>自学笔记_ch21_使用Git分布式版本控制系统 文章主要内容: 分布式版本控制系统 使用Git服务程序 提交数据 移除数据 移动数据 历史记录 还原数据 管理标签 ...

  3. 开发效率优化之Git分布式版本控制系统(一)

    阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680本篇文章将先从Git分布式版本控制系统来阐述开发效率优化 一,企业 ...

  4. GIT分布式版本控制系统

    Git诞生历史 我想大家还记得Linus torvalds在1991年时发布了Linux操作系统吧,从那以后Linux系统变不断发展壮大,因为Linux系统开源的特性,所以一直接受着来自全球Linux ...

  5. Git ——分布式版本控制系统

    Git ——分布式版本控制系统 本人git主页地址:https://github.com/lendoon/test.git git使用心得:初次接触git在课堂上,老师给我们提供了一个代码托管的场所, ...

  6. 手把手教你玩转Git分布式版本控制系统! (转载)

    目录 Git诞生历史 Git环境准备 Git安装部署 Git常用命令 Git基本操作 Git管理分支结构 Git管理标签 GitLab安装部署 GitHub托管服务 Git客户端工具 Git诞生历史 ...

  7. 手把手教你玩转Git分布式版本控制系统!

    目录 Git诞生历史 Git环境准备 Git安装部署 Git常用命令 Git基本操作 Git管理分支结构 Git管理标签 GitLab安装部署 GitHub托管服务 Git客户端工具 1 Git诞生历 ...

  8. GIT 分布式版本控制系统的简单使用介绍

    GIT 分布式版本控制系统的简单使用介绍 1.GIT的概念Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git 与 SVN 区别:1. GIT不仅仅是个版本控制系统,它 ...

  9. Git分布式版本控制系统(下)

    Git分布式版本控制系统(下) 链接:https://pan.baidu.com/s/1CgaEv12cwfbs5RxcNpxdAg 提取码:fytm 复制这段内容后打开百度网盘手机App,操作更方便 ...

随机推荐

  1. 对象存储服务MinIO安装部署分布式及Spring Boot项目实现文件上传下载

    目录 一.MinIO快速入门 1. MinIO简介 2. CentOS7更换成阿里云镜像 3. 安装 3.1 下载 3.2 运行测试 4. 配置脚本执行文件 4.1 创建配置执行文件 4.2 执行 二 ...

  2. day15.继承

    1.什么是继承     继承是一种新建子类的方式,新建的类称之为子类/派生类,被继承的称之为父类/基类       子类会遗传父类的属性   2.为何要用继承     类是解决对象之间冗余问题的    ...

  3. 日志功能 - 使用 conf 配置文件

    配置文件:Logger.conf 工具类:LogUtil.py 测试类:testDemo.py 执行效果 配置文件:Logger.conf 定义日志的类型.级别.格式等信息. [loggers] # ...

  4. k8s新手必看

    转载自https://juejin.im/post/6844903840139968520 Kubernetes零基础快速入门!初学者必看! 起源 Kubernetes 源自于 google 内部的服 ...

  5. 前后端分离中的无痛刷新token机制

    今天我们来说一说前后端分离中的无痛刷新token机制 博主先来分享一波福利,最近挖到的宝藏,刚开始学Java的同学看 https://www.bilibili.com/video/BV1Rx41187 ...

  6. 对象的可见性 - volatile篇

    作者:汤圆 个人博客:javalover.cc 前言 官人们好啊,我是汤圆,今天给大家带来的是<对象的可见性 - volatile篇>,希望有所帮助,谢谢 文章如果有误,希望大家可以指出, ...

  7. [Java] 数据类型, 变量, 运算符, 表达式

    title: [Java] 变量与表达式 你已经学会输出 Hello world 了, 那么现在, 我们来学习关于变量的知识 基本数据类型 在 Java 中, 有 8 种基本的数据类型: 名称 描述 ...

  8. 限制pyqt5应用程序 只允许打开一次

    起因 pyqt5程序创建桌面快捷方式后,多次单击图标 会打开多个UI界面,这种情况肯定是不允许的! 解决 if __name__ == '__main__': try: app = QtWidgets ...

  9. SpringCloud-Stream消息通信

    SpringCloud微服务实战系列教程 Spring Cloud Stream 消息驱动组件帮助我们更快速,更⽅便,更友好的去构建消息驱动微服务的.当时定时任务和消息驱动的⼀个对⽐.(消息驱动:基于 ...

  10. nodejs-Buffer(缓冲区)

    Node.js Buffer(缓冲区) JavaScript 语言自身只有字符串数据类型,没有二进制数据类型. 但在处理像TCP流或文件流时,必须使用到二进制数据.因此在 Node.js中,定义了一个 ...