Git的一些重要知识

来源:互联网 发布:sql转义字符 编辑:程序博客网 时间:2024/05/09 00:04

文件的三种状态

对于任意一个在工作区的文件,只要它至少被git add命令处理过,那么它就处于Git的追踪之下,且只有这三种状态:已暂存(staged),已修改(modified)和已提交(commited)。已暂存是使用git add命令将文件加入暂存区;已修改是之前已暂存过,然后进行第二次修改但未再次暂存;已提交是已使用git commit命令将文件成功保存至本地的数据中。

快照

对已修改或新添加的文件使用SHA-1算法求其HASH值,生成相应的blob对象(快照)保存到.git目录中,然后将HASH值和其他一些文件信息加入到暂存区。

工作区(Working Directory)

直译过来是工作目录,就是你使用git init初始化的目录(除了隐藏目录.git),这个目录放置了当前分支的所有项目文件。

暂存区(Index or stage)

保存着一个tree对象,当然这个tree对象还可以包含其他子tree对象,tree对象的叶子节点是一条记录,其内容是.git/bojects中的blob对象的索引以及其相关内容信息。也可以简单的说,tree对象只是记录了,Git的对象库(.git/bojects)中blob对象的索引和blob对象的其他信息,文件的内容其实是保存在.git/bojects中。

版本库(Repository)

在Git中,版本库存在于隐藏目录.git中,.git目录不算是工作区的内容。这里面存了很多东西,例如暂存区(index文件)、你的所有分支的文件内容,指向当前分支的最新一个commit的指针HEAD等。

Git的基本工作流程

  1. 在工作目录中修改文件,如果是新添加的或为暂存过的文件,其状态是未追踪(untracked),否则就是前面提到的三种状态之一;
  2. 用git add命令对文件(或目录)进行快照添加进暂存区,结果就是在.git/index文件中,保存为tree对象,而文件的内容保存为blob对象;
  3. 用git commit命令将暂存区的tree对象和所有文件快照永远保存在.git目录中,然后创建一个新的commit对象,这个对象保存了一个指向之前在暂存区中的tree对象的指针、一个指向前一次提交而创建的commit对象的指针、以及其他提交元数据,例如作者,提交时间等等;

分支

理解commit对象这个东西后,分支就很容易理解了。许多个commit对象组成一个单向链表,表头是当前最新的commit,由一个指针指向这个最新的commit,这个指针就像游标一样的。而分支就是,这个链表上的分叉,创建一个新的分支就是再多创建一个指向当前这个commit对象的指针。然后,这里有个HEAD指针,也指向的是当前我们正在工作的这个分支的最新的那个commit,然后在不同分支间跳转工作就通过这个HEAD指针。

Git实现版本回滚简述

Git每次进行快照,都只会保存有修改的内容,如下图所示:
这里写图片描述
观察一下这个图片就可以想到大概的回滚思路了,回滚需要做的就是顺着commit链表向前回溯,若当前版本的某个文件已被快照过,那就用前面版本的文件覆盖掉它,对当前版本的所有文件做这个处理后,就能让工作区的文件回到上个版本了,而HEAD指针只要移动一下就可以了。当然实际工程中会有很多问题需要考虑,这个只是我个人的一点理解。

0 0