Git使用学习(十六、Git的文件管理机制)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_16777851/article/details/88782452

集中式版本控制工具的文件管理机制

以文件变更列表的方式存储数据。这类系统将它们保存的信息看作是一组基本文件和每个文件随时间逐步累计的差异。

每次的上传到服务器上文件,保存在服务器的部分都是这次和上次版本之间的差异。

如果要从服务器更新到本地也是需要把原始文件的版本和每次的差异 都合并起来,组成一个版本。

这样的版本我们可以看到,有点是节约服务器的存储空间,但缺点也很明显,速度慢。

Git是把数据看作是对小型文件系统的一组快照。 每次你提交更新,或在 Git 中保存项目状态时,它主要对当时的全部文件制作一个快照并保存这个快照的索引。 为了高效,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。 Git 对待数据更像是一个 快照流。
 

快照的意思就是,每次都是直接保存这个版本的所有文件。

当然,一般来说,我们每次更改不会更改一个项目的所有文件,对于没有更改的文件git在这里保存的起始是这个版本对于上一个版本的指针。上图的虚线部分圈起来的相对之前版本没改动,所以所在版本只保留这个文件的指针。

git的提交对象

该提交对象还包含了作者的姓名和邮箱、提交时输入的信息以及指向它的父对象的指针
首次提交产生的提交对象没有父对象,普通提交操作产生的提交对象有一个父对象,而由多个分支合并产生的提交对象有多个父对象。
 

为了更加形象地说明,我们假设现在有一个工作目录,里面包含了三个将要被暂存和提交的文件。
暂存操作会为每一个文件计算校验和,然后会把当前版本的文件快照保存到Git 仓库中(Git 使用 blob 对象来保存它们),最终将校验和加入到暂存区域等待提交:
 

$ git add README test.rb LICENSE
$ git commit -m 'The initial commit of my project'

对我们来看就是上面的两条命令。

当使用 git commit 进行提交操作时,Git 会先计算每一个子目录(本例中只有项目根目录)的校验和,然后在Git 仓库中这些校验和保存为树对象。 随后,Git 便会创建一个提交对象,它除了包含上面提到的那些信息外,还包含指向这个树对象(项目根目录)的指针。如此一来,Git 就可以在需要的时候重现此次保存的快照。
现在,Git 仓库中有五个对象:三个 blob 对象(保存着文件快照)、一个树对象(记录着目录结构和 blob 对象索引)以及一个提交对象(包含着指向前述树对象的指针和所有提交信息)。
 

用图形表示为如下方式

提交对象及其父福相形成的链表结构

对于B或C都是做些修改后再次提交,那么这次产生的提交对象会包含一个指向上次提交对象(父对象)的指针。
 

猜你喜欢

转载自blog.csdn.net/qq_16777851/article/details/88782452