GIT 基础

基础知识

版本控制方式

GIT是一个版本控制系统,客户端并不只是提取最新版本的文件快照,而是把代码仓库完整地镜像下来。因为是将整个版本都下载到了本地,因此可以在无网络的情况下且在本地进行无限的修改提交,并不会因为网路的问题造成无法提交或者更新。相比于其他版本控制系统,git只关心整个文件数据是否有过变化这一状态,而其他的系统往往会很关系具体的变化内容。其他文件系统会保存每个文件的变化差异;git并不会保存文件的前后变化差异,每次提交均会有过变更的文件进行快照后后进行记录保存 。下图表示了两种版本控制系统在版本间的差异性,左图为其他版本控制器,右图为git版本控制器。
            

文件的三种状态

GIT中,每一个文件都只能是三种状态中的一种。这三种状态分别是:提交状态(committed)、修改状态(modified)、暂存状态(staged)。
提交状态:表示文件已经被保存在本地数据库(repository)中。
修改状态:表示已经修改的某个文件,但并没有提交保存,在工作目录(working directory、work tree)中。
暂存状态:表示文件已经修改完毕,准备提交的状态,保存在暂存区域(staging area、index)中。


基本git工作流程

工作目录:从项目中取出某个版本的所有文件和目录,然后用以开始后续工作的目录。
暂存区域:暂存区域是个简单的文件,一般放在git目录中,又称作index文件。
GIT目录:每个项目都有一个 .git 目录,是git用来保存保存元数据和对象数据库的地方。
使用git的工作流程如下:
1、在工作目录中修该某些文件,文件状态为modified;
2、对修改后的文件进行快照,然后保存到暂存区域,文件状态为staged;
3、提交更新,将保存在暂存区域的文件快照永久转存到Git目录中,文件状态为committed。

几个概念

git本质上一套内容寻址文件系统,在此之上添加了一个版本控制系统界面。

Git目录

如果使用git init 命令,那么会在当前目录下生成.git文件夹。git目录如下: hooks/,info/,objects/,refs/,config,description,HEAD。如果还执行过add和commit操作,那么 还会生成:logs/,index,COMMIT_EDITMSG。HEAD 及 index 文件,objects 及 refs 目录是 Git 的核心部分。其中:
description 文件仅供 GitWeb 程序使用;
config 文件包含了项目特有的配置选项;
info 目录保存了一份不希望在 .gitignore 文件中管理的忽略模式 (ignored patterns) 的全局可执行文件;
hooks 目录保存了客户端或服务端钩子脚本;
objects 目录存储所有数据内容;
refs 目录存储指向数据 (分支) 的提交对象的指针;
HEAD 文件指向当前分支;
index 文件保存了暂存区域信息。


Git对象

blob对象

git是一套内容寻址文件系统,从核心上来说是存储键值对。它允许插入任意类型的内容,并会返回一个键值,通过该键值可以在任何时候再取出该内容。git初始化了objects目录,同时在该目录下创建了pack和info两个子目录。这Git 存储数据内容的方式是为每份内容生成一个文件,取得该内容与头信息的 SHA-1 校验和,创建以该校验和前两个字符为名称的子目录,并以 (校验和) 剩下 38 个字符为文件命名 (保存至子目录下)。 文件 SHA-1 值可能与实际的值不同且存储的并不是文件名而仅仅是文件内容。这种对象类型称为 blob 。

tree对象

tree 对象可以存储文件名,同时也允许存储一组文件。Git 中所有内容以 tree 或 blob 对象存储,其中 tree 对象对应于的目录,blob 对象则大致对应于 inodes 或文件内容。一个单独的 tree 对象包含一条或多条 tree 记录,每一条记录含有一个指向 blob 或子 tree 对象的 SHA-1 指针,并附有该对象的权限模式 (mode)、类型和文件名信息。通常 Git 根据暂存区域或 index 来创建并写入一个 tree 。因此要创建一个 tree 对象的话首先要通过将一些文件暂存从而创建一个 index 。


commit对象

不同的 tree 对象指向了跟踪的项目的不同快照,可是我们必须记往各自得SHA-1 值以获得这些快照,这就会造成一些困扰。 而commit 对象可以解决这些问题,它指明了该时间点项目快照的顶层树对象、作者/提交者信息以及当前时间戳、一个空行,以及提交注释信息。每一个 commit 对象都指向了创建的树对象快照。

对象存储

当Git存储数据内容时,同时会有一个文件头被存储起来。git存储数据的流程如下:
1)Git 以对象类型为起始内容构造一个文件头,然后添加一个空格,接着是数据内容的长度,最后是一个空字节 (null byte)。
2)Git 将文件头与原始数据内容拼接起来,并计算拼接后的新内容的 SHA-1 校验和。
3)Git 用 zlib 对数据内容进行压缩。
4)最后将用 zlib 压缩后的内容写入磁盘。需要指定保存对象的路径 (SHA-1 值的头两个字符作为子目录名称,剩余 38 个字符作为文件名保存至该子目录中)。
所有的 Git 对象都以这种方式存储,惟一的区别是类型不同文件头起始内容不同。不过 blob 几乎可以是任意内容,而commit 和 tree 的数据却是有固定格式的。

Git引用

不同的对象有不同的SHA-1值,因此需要一个文件来用一个简单的名字来记录这些 SHA-1 值,这样就可以用这些指针而不是原来的 SHA-1 值去检索对应的内容了。在 Git 中称之为“引用”(references 、refs)。你可以在 .git/refs 目录下面找到这些包含 SHA-1 值的文件。基本上 Git 中的一个分支其实就是一个指向某个工作版本一条 HEAD 记录的指针或引用。每当你执行 git branch (分支名称) 这样的命令,Git 基本上就是执行 update-ref 命令,把你现在所在分支中最后一次提交的 SHA-1 值,添加到你要创建的分支的引用。
HEAD 标记
HEAD 文件是一个指向你当前所在分支的引用标识符。这个引用标识符并不包含 SHA-1 值,而是一个指向另外一个引用的指针。
Tags
Tag 对象包含一个标签,一组数据,一个消息和一个指针。Tag 对象指向一个 commit 而不是一个 tree。它就像是一个分支引用,永远指向同一个 commit。Tag 有两种类型:annotated 和 lightweight 。
Remotes
remote reference(远程引用)。如果你添加了一个 remote 然后推送代码过去,Git 会把最后一次推送到这个 remote 的每个分支的值都记录在 refs/remotes 目录下。Remote 应用和分支主要区别在于他们是不能被 check out 的。Git 将其当作是标记这些分支在服务器上最后状态的一种书签。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值