Git——基本思想和工作原理(二)
核心知识点:
1.Git关注文件数据的整体是否发生变化,对更新的文件做一个快照,然后保存一个指向快照的索引,而不会关注文件数据的具体变化。
2.Git版本的更新几乎都发生在本地,不会因为没有网络而不能编辑文件或更新文件。
3.使用SHA-1取哈希值,从而获取校验和计算,因此Git中会有非常多hash类型的指纹字符串,以此来保证数据的完整性。
4.Git中文件的三种状态:
a.已修改:对文件进行了修改但是并没有提交
b.已暂存:将文件添加到下在要保存的清单之中
c.已提交:将文件推送到数据仓库,这样数据的变更就代表已经完成。
5.Git文件流转的区域:
a.Git工作目录:从项目中获取的某个目录,进行后续编辑工作
b.暂存区域:文件进行了修改但是还没有提交暂存的位置
c.本地仓库:保存元数据和对象数据库的地方,copy都是从这里取数据
6.根据文件的位置来判断文件的状态,如果文件有版本号,代表已经提交。
Git究尽是怎样的一个系统?接下来会为您进行详细的解读。
(1)直接记录快照,而非差异比较
Git和其它版本控制系统的主要差别在于,Git只关心文件数据的整体是否发生变化,而大多数其它版本控制系统则只关心文件内容的具体差异。
这类系统(CVS、Bazaar等)每次记录有哪些文件做了更新操作,以及都更新了那些行的什么内容。
Git并不保存这些前后变化的差异数据。实际上,Git更像是把变化的文件作快照后,记录在一个微型的文件系统中。
每次提交更新时,它会纵览一遍所有文件的指纹信息并对文件做一快照,然后保存一个指向这次快照的索引。
为了提高性能,若文件没有变化,Git则不会再次保存,而是只对上次保存的快照做一链接。
Git的工作方式如下图所示:
这是Git同其它系统的重要区别。它完全颠覆了传统版本控制系统的套路,并对各个环节的实现方式做了新的设计。
Git更像是一个小型的文件系统,但它同时还提供了许多以此作为基础的超强工具,而不只是一个简单的VCS。
(2)近乎所有操作都是在本地执行
在Git中的绝大多数操作都只需要访问本地文件和资源,不用联网。
但是如果用CVCS(集中式版本控制系统)的话,差不多所有的操作都需要连接网络。
因为Git在本地磁盘上就保存着所有当前项目的历史更新,所有处理起来速度飞快。
举个例子,如果要浏览项目的历史更新摘要,Git不用跑到外面的服务器上去取数据回来,而直接从本地数据库读取后展示给你。
所以任何时候你都可以马上翻阅,无需等待。如果你想看当前版本的文件和一个月前版本文件之间有任何差异,
Git会取出一个月前的快照和当前文件做一次差异运算,而不是请求远程服务器来做这件事,或是把老版本的文件拉到本地来比较。
用CVCS的话,没有网络或者断开VPN你就无法做任何事情。
但是用Git的话,你就算在火车上或者大山里,都可以愉快的提交更新,等到有网络的时候再上传到远程仓库。
同样,在回家的路上,不用连接VPN你也可以继续工作。换作其它版本控制系统这几乎不可能或者实现起来非常麻烦。
有些版本控制系统没有VPN都无法编辑文件,例如Perforce;还有一些则无法完成更新.
(3)时刻保持数据的完整性
在保存到Git之前,所有数据都要进行内容的校验和(checksum)计算,并将此结果作为数据的唯一标识和索引。
换句话说,不可能在你修改了文件或者目录之后,Git还一无所知。这项特性作为Git的设计哲学,设置在整体架构的最底层。
所以如果文件在传输时变得不完整,或者磁盘损坏导致文件数据缺失,Git都能立即察觉。
Git使用SHA-1算法计算数据的校验和,通过对文件的内容或目录的计算出一个SHA-1哈希值,作为指纹字符串。
该字符串由40个十六进制字符(0-9,a-f)组成,看起来就像是这样:
24b9da6552252987aa493b52f8696cd6d3b00373
Git的工作完全依赖于这类指纹字符串,所有保存在Git数据库中的东西都是用此hash值来做索引,而不是靠文件名。
(4)多数操作仅添加数据
常用的Git操作大多仅仅把数据添加到数据库。因为任何一种不可逆的操作,比如删除数据,都会使回退或重现历史版本变得困难重重。
在别的VCS中,若还未提交更新,就可能丢失或者混淆一些修改的内容,
但在Git里,一旦提交快照之后就完全不用担心丢失数据,特别是养成定期推送到其它仓库的习惯后。
(5)文件的三种状态
对于任何一个文件,在Git内都只有三种状态:已提交(committed),已修改(modified)和已暂存(staged).
已提交表示该文件已经被安全地保存在数据库中了;已修改表示修改了某个文件,但是还没有提交保存;已暂存表示把已经修改地文件放在下次提交时要保存地清单中。
由此我们看到Git管理项目时,文件流转地三个工作过区域:Git地工作目录,暂存区域,以及本地仓库。
每个项目都有一个Git目录(如果git clone出来地的话,就是其中.git的目录;如果git clone--base的话,新建的目录本身就是Git目录),
它是Git用来保存元数据和对象数据库的地方。
该目录非常重要,每次克隆镜像仓库,实际拷贝的就是这个目录里面的数据。
从项目有中取出某个版本的所有文件何目录,用以开始后续工作的叫做工作目录。
这些文件实际上都是从Git目录中的压缩对象数据库中提取出来,接下来就可以在工作目录中对这些文件进行编辑。
基本的Git工作流程如下:
- 在工作目录中修改某些文件。
- 对修改的文件进行快照,然后保存到暂存区域
- 提交更新,将保存在暂存区域的文件快照永久存储到Git目录中。
所以,我们可以从文件所处的位置来判断状态:
如果Git目录中保存着的特定版本文件,就属于已提交状态;
如果做了修改并已放入暂存区域,就属于已暂存状态;
如果自上次取出后,作了修改还没有放在暂存区域,就是已修改状态。
转载于:https://www.cnblogs.com/yangmingxianshen/p/8361679.html
Git——基本思想和工作原理(二)相关推荐
- 以太网及网络工作原理二
以太网及网络工作原理二 2.以太网工作原理 2.2.以太网数据帧 2.3.数据帧传输 2.4.交换机的工作原理 2.5.网线的分类 2.6.千兆以太网 2.6.1.千兆位以太网标准主要四种类型的传输介 ...
- Git 详细教程之一: Git 简介及其基本工作原理
Git 是一个免费的.开源的『分布式版本控制系统』,可以快速高效地处理从小型到大型的各种项目.官网为:https://git-scm.com/.它具有廉价的本地库,方便的暂存区域和多个工作流分支 ...
- Git学习——Git基本工作原理(入门级教程,通过玩转Git本地仓库,帮助新手快速入手Git)
如果你只是想知道如何用Git上传代码至托管平台,请看:创建码云仓库并完成第一次上传(https) 及 使用ssh协议上传代码 如果你想了解Git本地仓库的工作原理,欢迎阅读本文. 文章目录 一.分区及 ...
- foreach的工作原理和深拷贝、浅拷贝
一.foreach的工作原理 二.拷贝.深拷贝和浅拷贝 转载于:https://www.cnblogs.com/wesley168/p/6814418.html
- Cisco IOS Unicast NAT 工作原理 [一]
NAT技术的出现源于对私有网络安全性的要求以及IPv4地址不够用的现状.Cisco IOS所支持的常用NAT技术有以下几种.今天发现公司同事对Cisco NAT的实现理解的不好,导致配置出问题.这里就 ...
- 华为防火墙及它的工作原理
一.华为防火墙产品介绍 USG2000.USG5000.USG6000和USG9500构成了华为防火墙的四大部分,分别适合于不同环境的网络需求,其中,USG2000和USG5000系列定位于UTM(统 ...
- 路由器的工作原理,形成,转发数据包的过程
一.路由器的工作原理 二.路由表的形成 三.静态路由和默认路由 四.路由器转发数据包的封装过程 五.静态路由和默认路由的配置 概述: 在只有一个网段的网络中,包可以很容易地从源主机到达目标主机,但是如 ...
- 视频网站的工作原理-->m3u8视频文件的提取与解析(理论)
目录 一.视频网站的工作原理 二.抓取视频步骤 2.1.找到m3u8文件 2.2.把m3u8下载到ts文件 2.3.ts文件合并为mp4文件 一.视频网站的工作原理 古老的视频网站的视频一般是在源码放 ...
- dlp型3d打印机_DLP3D打印机的工作原理及优势
原标题:DLP3D打印机的工作原理及优势 3D打印技术发展至今各种新技术应运而生,可使用材料越来越多,应用领域也越来越广.时至今日,3D打印技术不再那么高高在上,已经深入大众的生活. 3D打印技术众多 ...
- AT88SC0104C加密芯片的工作原理
转载自 f2k5 1. 加密芯片的功能和基本原理. 加密芯片主要用来保护烧进Flash里面的程序即使被盗版者读走, 在非法板上也不能运行, 从而达到保护自己劳动成果的目的. 本文主要内容: 一. ...
最新文章
- 使用logon trigger完成动态的session跟踪
- ES _all、_source的使用——_all字段连接所有字段的值构成一个用空格(space)分隔的大string而被analyzed和index,document主体保存在_source中...
- else if mybatis 嵌套_mybatis踩坑之——foreach循环嵌套if判断
- JZOJ 5623. 【NOI2018模拟4.2】program
- 闭包、执行环境、作用域链
- android获得一个view的高度,Android ViewTreeObserver使用总结及获得View高度的几种方法...
- lucene计分公式详解
- leetcode203 移除链表元素
- MFC中模态对话框和非模态对话框的差别
- phpnow 安装apache失败_PHPnow安装服务[apache_pn]失败的问题的解决方法
- Python操作Oracle
- Bash之正则表达式
- 注册表修改服务器连接数量,如何通过Win10注册表更改时间服务器参数值?
- 直播app源码的搭建,仍有许多问题等待我们去解决
- Javaweb 九大内置对象
- 应急指挥中心建设方案
- python连接sql server2008_Python 使用 pyodbc 连接 SQL Server 2008
- 努比亚android P的功能,努比亚Z17Android P 正式版已开启小批量FOTA推送
- 大学计算机考试常用函数,大学计算机二级考试 ExceL表格函数
- Upgraded Edition