Linux进阶之Git分布式版本控制系统篇
一、Git介绍
Git(读音为/gɪt/。)是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,所以,工作的时候就不需要联网了,因为版本库都是在自己的电脑 上。现在每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
主要有如下特点:
1. 版本控制(可以根据需要随意切换到任何版本)
2. 分布式
3. 工作过程是将服务器上的代码下载到本地,本地开发完成后,在提交到服务器端
git相比于svn功能更加的强大,命令也很多。本篇博客将详细介绍一些常用命令的使用操作。
二、Git和SVN的对比
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分布式版本控制系统篇的更多相关文章
- g4e基础篇#2 Git分布式版本控制系统的优势
g4e 是 Git for Enterprise Developer的简写,这个系列文章会统一使用g4e作为标识,便于大家查看和搜索. 章节目录 前言 1. 基础篇: 为什么要使用版本控制系统 Git ...
- 《Linux就该这么学》自学笔记_ch21_使用Git分布式版本控制系统
<Linux就该这么学>自学笔记_ch21_使用Git分布式版本控制系统 文章主要内容: 分布式版本控制系统 使用Git服务程序 提交数据 移除数据 移动数据 历史记录 还原数据 管理标签 ...
- 开发效率优化之Git分布式版本控制系统(一)
阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680本篇文章将先从Git分布式版本控制系统来阐述开发效率优化 一,企业 ...
- GIT分布式版本控制系统
Git诞生历史 我想大家还记得Linus torvalds在1991年时发布了Linux操作系统吧,从那以后Linux系统变不断发展壮大,因为Linux系统开源的特性,所以一直接受着来自全球Linux ...
- Git ——分布式版本控制系统
Git ——分布式版本控制系统 本人git主页地址:https://github.com/lendoon/test.git git使用心得:初次接触git在课堂上,老师给我们提供了一个代码托管的场所, ...
- 手把手教你玩转Git分布式版本控制系统! (转载)
目录 Git诞生历史 Git环境准备 Git安装部署 Git常用命令 Git基本操作 Git管理分支结构 Git管理标签 GitLab安装部署 GitHub托管服务 Git客户端工具 Git诞生历史 ...
- 手把手教你玩转Git分布式版本控制系统!
目录 Git诞生历史 Git环境准备 Git安装部署 Git常用命令 Git基本操作 Git管理分支结构 Git管理标签 GitLab安装部署 GitHub托管服务 Git客户端工具 1 Git诞生历 ...
- GIT 分布式版本控制系统的简单使用介绍
GIT 分布式版本控制系统的简单使用介绍 1.GIT的概念Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git 与 SVN 区别:1. GIT不仅仅是个版本控制系统,它 ...
- Git分布式版本控制系统(下)
Git分布式版本控制系统(下) 链接:https://pan.baidu.com/s/1CgaEv12cwfbs5RxcNpxdAg 提取码:fytm 复制这段内容后打开百度网盘手机App,操作更方便 ...
随机推荐
- 2020 OO 第三单元总结 JML语言
title: 2020 OO 第三单元总结 date: 2020-05-21 10:10:06 tags: OO categories: 学习 第三单元终于结束了,这是我目前为止最惨的一单元,第十次作 ...
- Java刷题-tree
一.分别按照二叉树先序,中序和后序打印所有的节点. 这道题就是书上的算法思想的实际使用,唯一需要特别注意到的是用递归的方式建树,还是比较巧妙的,因为一棵树的建立过程字符流是重复使用的,用递归的方式对根 ...
- 【Azure Redis 缓存 Azure Cache For Redis】Redis连接池
问题描述 Redis根据定价层说明,不同级别支持的连接数最多可达4万(同时),但是当短时间又大量连接请求建立的时候,Redis服务的服务压力非常大,到达100%.严重影响了高响应的要求.最严重时,经常 ...
- 【Scrapy(二)】Scrapy 中的 Pipline,Item,Shell组件
Pipline: 1.爬虫项目与爬虫的区别与关联: 一个爬虫项目可以包含多个爬虫,如下图中爬虫项目firstspider 包含多个爬虫itcst 和爬虫itcast1 2.多个爬虫是公用一套Pipli ...
- Spring初识及其IOC入门
一.框架 框架是一些类和接口的集合,它一个半成品,已经对基础的代码进行了封装并提供相应的API,开发者在使用框架时直接调用封装好的api可以省去很多代码编写,从而提高工作效率和开发速度. 二.Spri ...
- hdu4122 制作月饼完成订单的最小花费
题意: 有一个加工厂加工月饼的,这个工厂一共开业m小时,2000年1月1日0点是开业的第一个小时,每个小时加工月饼的价钱也不一样,然后每个月饼的保质期都是t天,因为要放在冰箱里保存,所以在 ...
- android添加账户流程分析涉及漏洞修复
android修复了添加账户代码中的2处bug,retme取了很酷炫的名字launchAnyWhere.broadAnywhere(参考资料1.2).本文顺着前辈的思路学习bug的原理和利用思路. 我 ...
- Windows 驱动加载程序代码
#include <windows.h> #include <winsvc.h> #include <conio.h> #include <stdio.h&g ...
- Andrew Ng机器学习算法入门(十):过拟合问题解决方法
在使用机器学习对训练数据进行学习和分类的时候,会出现欠拟合和过拟合的问题.那么什么是欠拟合和过拟合问题呢?
- 【转】docker打包python应用
转自https://www.cnblogs.com/shenh/p/9518343.html 一.前言 容器使用沙箱机制,互相隔离,优势在于让各个部署在容器的里的应用互不影响,独立运行,提供更高的安全 ...