核心知识点:

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目录中保存着的特定版本文件,就属于已提交状态;

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

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

Git——基本思想和工作原理(二)的更多相关文章

  1. Git 思想和工作原理

    从根本上来讲,Git是一个内容寻址文件系统,并在此之上提供了一个版本控制系统的用户界面,它是一个非常强大且易用的工具,理解Git的工作原理,能够帮助我们更容易学习和使用Git. 本文不会像书籍里那样, ...

  2. Hadoop周边生态软件和简要工作原理(二)

    转自: http://www.it165.net/admin/html/201307/1532.html Sqoop: sqoop在hadoop生态系统中也是应用率比较高的软件,主要是用来做ETL工具 ...

  3. Android 基于Netty的消息推送方案之概念和工作原理(二)

    上一篇文章中我讲述了关于消息推送的方案以及一个基于Netty实现的一个简单的Hello World,为了更好的理解Hello World中的代码,今天我来讲解一下关于Netty中一些概念和工作原理的内 ...

  4. How Javascript works (Javascript工作原理) (二) 引擎,运行时,如何在 V8 引擎中书写最优代码的 5 条小技巧

    个人总结: 一个Javascript引擎由一个标准解释程序,或者即时编译器来实现. 解释器(Interpreter): 解释一行,执行一行. 编译器(Compiler): 全部编译成机器码,统一执行. ...

  5. Git:三、工作原理

    首先,我们对工作区也就是文件夹中的文档进行修改. 然后,把修改并需要存档的文档用add命令放到暂存区,并且可以放很多文档. 最后,一个阶段的工作告一段落,使用commit命令把暂存区的内容一股脑存到G ...

  6. Zookeeper工作原理二

    ZooKeeper是Hadoop的正式子项目,它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护.名字服务.分布式同步.组服务等.ZooKeeper的目标就是封装好复杂易出错的关键服务 ...

  7. git总结一、工作中常用基础命令

    首先来了解两个概念: 工作区:比如你的项目目录 暂存区:git和其他版本控制系统的不同之处就是有这个暂存区的概念. .git不是工作区,而是git 版本库,在版本库中存放着很多东西,比如暂存区(sta ...

  8. 代码管理工具 --- git的学习笔记二《git的工作原理》

    通过几个问题来学习代码管理工具之git 一.git是什么?为什么要用它?使用它的好处?它与svn的区别,在Mac上,比较好用的git图形界面客户端有 git 是分布式的代码管理工具,使用它是因为,它便 ...

  9. Git的思想和基本工作原理

    Git的思想和基本工作原理 Chapter: 开始了解Git 1. 先谈谈版本控制的一些事 2. Git诞生背后的一些故事 3. 版本控制:集中式VS分布式 4. Git的思想和基本工作原理 5. G ...

随机推荐

  1. linux下打开、关闭tomcat,实时查看tomcat执行日志

     启动:通常是运行sh tomcat/bin/startup.sh   停止:通常是运行sh tomcat/bin/shutdown.sh脚本命令   查看:运行ps -ef |grep tomc ...

  2. 已经入了vim的坑

    一.移动光标 1.左移h.右移l.下移j.上移k 2.向下翻页ctrl + f,向上翻页ctrl + b 3.向下翻半页ctrl + d,向上翻半页ctrl + u 4.移动到行尾$,移动到行首0(数 ...

  3. Android EditText 输入password是否可见

    设置password不可见 etAfter.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD); 设置password可见 etA ...

  4. css3中的新特性经典应用

    这篇文章主要分析css3新特性的典型应用,都是干活,没得水分. 1.动画属性:animation. 利用animation可以实现元素的动画效果,他是一个简写属性,用于设置6个动画属性:aminati ...

  5. 用Python实现邮件发送Hive明细数据

    代码地址如下:http://www.demodashi.com/demo/12673.html 一.需求描述 客户需要每周周一接收特定的活动数据,生成Excel或是CSV文件,并通过邮件发送给指定接收 ...

  6. KingdeeK3-修改单据邮件发送的自定义字段

    只需要执行类似下面语句即可: update ICTemplateentry set FVisForBillType = 63,flookupcls=6 where fid ='P01' and fhe ...

  7. sprint3 【每日scrum】 TD助手站立会议第七天

    站立会议 组员 昨天 今天 困难 签到 刘铸辉 (组长) 在日历各个事件上都增加闹钟显示,并将数据传递给日程和时间表 调整闹钟和整个项目的显示效果,最后做出了微信界面滑动的显示效果 闹钟在广播协议的时 ...

  8. CentOS4.5下LVS方案

    环境描述:本文在配置LVS时使用三台linux,一台做Directorserver (192.168.0.25) ,两台做realserver(192.168.0.127 192.168.0.12,在 ...

  9. Android6.0系统添加那些新特性

        北京时间9月30日凌晨在美国旧金山举行2015年秋季新品公布会.在公布会上代号为"Marshmallow(棉花糖)"的安卓6.0系统正式推出.新系统的总体设计风格依旧保持扁 ...

  10. iOS SDWebImage加载大图导致内存崩溃解决方案

    static BOOL SDImageCacheOldShouldDecompressImages = YES; static BOOL SDImagedownloderOldShouldDecomp ...