热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Git——基本思想和工作原理(二)

核心知识点:1.Git关注文件数据的整体是否发生变化,对更新的文件做一个快照,然后保存一个指向快照的索引,而不会关注文件数据的具体变化。 2.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——基本思想和工作原理(二)

这是Git同其它系统的重要区别。它完全颠覆了传统版本控制系统的套路,并对各个环节的实现方式做了新的设计。

Git更像是一个小型的文件系统,但它同时还提供了许多以此作为基础的超强工具,而不只是一个简单的VCS。

 

(2)近乎所有操作都是在本地执行

在Git中的绝大多数操作都只需要访问本地文件和资源,不用联网。

但是如果用CVCS(集中式版本控制系统)的话,差不多所有的操作都需要连接网络。

因为Git在本地磁盘上就保存着所有当前项目的历史更新,所有处理起来速度飞快。

 

举个例子,如果要浏览项目的历史更新摘要,Git不用跑到外面的服务器上去取数据回来,而直接从本地数据库读取后展示给你。

所以任何时候你都可以马上翻阅,无需等待。如果你想看当前版本的文件和一个月前版本文件之间有任何差异,

Git会取出一个月前的快照和当前文件做一次差异运算,而不是请求远程服务器来做这件事,或是把老版本的文件拉到本地来比较。

 

用CVCS的话,没有网络或者断开***你就无法做任何事情。

但是用Git的话,你就算在火车上或者大山里,都可以愉快的提交更新,等到有网络的时候再上传到远程仓库。

同样,在回家的路上,不用连接***你也可以继续工作。换作其它版本控制系统这几乎不可能或者实现起来非常麻烦。

有些版本控制系统没有***都无法编辑文件,例如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目录(如果git clone出来地的话,就是其中.git的目录;如果git clone--base的话,新建的目录本身就是Git目录),

它是Git用来保存元数据和对象数据库的地方。

该目录非常重要,每次克隆镜像仓库,实际拷贝的就是这个目录里面的数据。

 

从项目有中取出某个版本的所有文件何目录,用以开始后续工作的叫做工作目录。

这些文件实际上都是从Git目录中的压缩对象数据库中提取出来,接下来就可以在工作目录中对这些文件进行编辑。

基本的Git工作流程如下:

  • 在工作目录中修改某些文件。
  • 对修改的文件进行快照,然后保存到暂存区域
  • 提交更新,将保存在暂存区域的文件快照永久存储到Git目录中。

所以,我们可以从文件所处的位置来判断状态:

如果Git目录中保存着的特定版本文件,就属于已提交状态;

如果做了修改并已放入暂存区域,就属于已暂存状态;

如果自上次取出后,作了修改还没有放在暂存区域,就是已修改状态。

 


推荐阅读
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文介绍了PhysioNet网站提供的生理信号处理工具箱WFDB Toolbox for Matlab的安装和使用方法。通过下载并添加到Matlab路径中或直接在Matlab中输入相关内容,即可完成安装。该工具箱提供了一系列函数,可以方便地处理生理信号数据。详细的安装和使用方法可以参考本文内容。 ... [详细]
  • 基于事件驱动的并发编程及其消息通信机制的同步与异步、阻塞与非阻塞、IO模型的分类
    本文介绍了基于事件驱动的并发编程中的消息通信机制,包括同步和异步的概念及其区别,阻塞和非阻塞的状态,以及IO模型的分类。同步阻塞IO、同步非阻塞IO、异步阻塞IO和异步非阻塞IO等不同的IO模型被详细解释。这些概念和模型对于理解并发编程中的消息通信和IO操作具有重要意义。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
author-avatar
天堂寨旅游2013_668
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有