一、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. Recoil Input 光标位置被重置到末尾的问题

    考察如下代码,页面中有个输入框,通过 Recoil Atom 来存储输入的值. App.tsx function NameInput() { const [name, setName] = useRe ...

  2. Java(246-264)【List、Set】

    1.数据结构_栈 Stack先进后出 2.数据结构_队列 Queue先进先出 3.数据结构_数组 Array查询快.增删慢 需要创建一个新数组,将指定新元素存储在指定索引位置,再把原数组元素根 据索引 ...

  3. IntelliJ IDEA/Android Studio插件开发指南

    前言 目前在为安卓手机QQ做自动化的相关工作,包括UI自动化,逻辑层自动化等.使用到的uiautomator等框架,需要在Android Studio进行编码工作. 其中很多工作如果做到插件化的话,可 ...

  4. 一文完全掌握 Go math/rand

    Go 获取随机数是开发中经常会用到的功能, 不过这个里面还是有一些坑存在的, 本文将完全剖析 Go math/rand, 让你轻松使用 Go Rand. 开篇一问: 你觉得 rand 会 panic ...

  5. uni-app&H5&Android混合开发一 || 最全面的uni-app离线打包Android平台教程

    前言: 为什么会写这么一个教程,因为很久之前做过一个对接银行POS我们的系统是使用的H5开发的app应用.但是假如对结果银行相关业务的小伙伴应该都清楚,银行的业务相对于其他的对接方而言安全性比较高,而 ...

  6. web技术培训(二)-Flask后端框架初识

    web网站发展至今,特别是服务器端,涉及到的知识.内容,非常广泛.这对程序员的要求会越来越高.如果采用成熟,稳健的框架,那么一些基础的工作,比如,安全性,数据流控制等都可以让框架来处理,那么程序开发人 ...

  7. 【点分治】2019 首尔 icpc Gene Tree

    题目 链接:https://ac.nowcoder.com/acm/contest/15644/B来源:牛客网 A gene tree is a tree showing the evolution ...

  8. layui中流加载layui.flow

    1.引入layui.css和layui.js 2. html中定义容器 <div id="demo"></div> js部分: layui.use('flo ...

  9. Java解析xml文件遇到特殊符号&会出现异常的解决方案

    文/朱季谦 在一次Java解析xml文件的开发过程中,使用SAX解析时,出现了这样一个异常信息: Error on line 60 of document : 对实体 "xxx" ...

  10. @JsonFormat 格式化时间 时出现时间不准确问题

    今天突然报个问题,简单来说说就是数据库某一字段的记录时间为 14点,然而展示到前台却是 6点 我腚眼一看,postman测试的数据也是6点 然而idea查出来的并不是6点 再仔细一瞅idea实体类的时 ...