Git|探寻Git如何管理文件版本的小秘密

简介: 本文的主要围绕着下面这个问题展开的,在阅读之前可以先自己思考一下问题的答案是什么:git 是如何管理项目每次变更记录的?

本文的主要围绕着下面这个问题展开的,在阅读之前可以先自己思考一下问题的答案是什么?

  • git 是如何管理项目每次变更记录的?

当我们创建一个仓库的时候,在仓库的根目录下,除了项目文件,还有一个.git文件夹。.git文件夹中的内容就与版本控制相关。

在探秘 git 如何记录修改记录之前,我们先看看.git下的一些文件用途:

  • .git/config:主要是当前项目的git配置信息
  • .git/logs/:此文件夹主要记录每个分支的每次修改的日志
  • .git/HEAD:记录工作区中指向哪一个分支
  • .git/refs/heads/:此文件夹下存放的文件对应每一个分支,文件中存放的是commit对应的版本号

.git/HEAD.git/refs/heads/组合起来正好表示工作区的项目在哪个分支的哪次提交上面做修改。

接着看一下 git 资源库的对象,首先我们要借助一个命令git cat-file,这个可以查看资源库对象的内容或类型和大小信息。

  • git cat-file -t:查看资源库对象的类型
  • git cat-file -p:查看资源库对象的内容

每一次的 commit 都会仓库中的文件产生一些改变,这时候会生成一个记录,会有一个对应的修订号,这就像对当时的项目文件做一次快照处理,这个是通过资源库的对象保存的。

首先查看仓库的提交记录:

image.png

接着我们选取一次修订号,查看这个对象的类型和内容

git cat-file -t 2f001c07fee6d3357da689b0fce
git cat-file -p 2f001c07fee6d3357da689b0fce

image.png

从这个对象内容的,我们可以看出来一个commit对象,主要包含一下几部分

  • tree:修改的文件路径,这里指向一个文件夹
  • parent:上一次提交代码时的修订号,对应日志中上一次的提交记录
  • author:修改文件的作者
  • committer:提交修改的人,提交人和修改人可以是不同的人

我们可以通过 commit 对象里面的内容接着往下查看,先查看一下tree里面的内容

image.png

这个对象里面包含两个blob类型的对象,通过行末信息我们可以发现这是之前添加的a.txtb.txt文件。

如果我们在a.txt同级目录创建一个test文件夹,里面添加一个文件c.txt,那么git会怎么存储呢?


1、添加一个新的文件,提交记录会改变,我们需要查看最新的提交记录

image.png

2、查看最新的提交记录的对象的内容

image.png

3、接着去查询对应tree对象内容,可以发现其中除了文件,还指向了另外一个tree,对应的是test文件夹,

image.png

4、接着查看test文件夹对应的tree对象,这里面存放着c.txt文件

image.png

5、如果我们接着往下走,查看这个blob对应的修订号,会发现里面就是c.txt文件中的内容

image.png

此时,对Git中的文件存放方式可以有一个大概的了解了,每次 commit 对应一个对象,里面存放一些提交相关的信息,并且指向了上次提交记录和一个tree,tree表示一个文件夹,commit中的这个tree这个文件夹更像是整个项目的根目录。

一个tree中可能存在tree,也可能存在blobblob表示目录中的文件,tree表示这个目录中的目录。简直就是套娃操作。

示例项目可以参考下图

git存储.png

目录
相关文章
|
1月前
|
Shell 开发工具 git
git学习三:git使用:删除仓库,删除仓库内文件
通过GitHub的设置页面删除仓库,以及如何使用Git命令行删除仓库中的文件或文件夹。
149 1
git学习三:git使用:删除仓库,删除仓库内文件
|
1月前
|
开发工具 git 索引
git上面中新建gitignore文件,并且去除已经在仓库版本管理中的文件夹
git上面中新建gitignore文件,并且去除已经在仓库版本管理中的文件夹
69 4
|
1月前
|
开发工具 git
git显示开发日志+WinSW——将.exe文件注册为服务的一个工具+图床PicGo+kubeconfig 多个集群配置 如何切换
git显示开发日志+WinSW——将.exe文件注册为服务的一个工具+图床PicGo+kubeconfig 多个集群配置 如何切换
38 1
|
2月前
|
安全 开发工具 git
git合并错了,我想回退到之前的版本
git合并错了,我想回退到之前的版本
|
5月前
|
开发工具 数据中心 git
详解IDEA git 版本回滚
详解IDEA git 版本回滚
234 0
|
6月前
|
开发工具 git
如何使git提交的时候忽略一些特殊文件?
如何使git提交的时候忽略一些特殊文件?
|
3月前
|
缓存 开发工具 git
给Git仓库添加.gitignore:清理、删除、排除被Git误添加的临时文件
本文介绍了如何为Git仓库添加`.gitignore`文件来排除不需要跟踪的临时文件,并展示了如何删除已经被提交的临时文件缓存,以清理Git仓库中的不必要文件。
270 0
给Git仓库添加.gitignore:清理、删除、排除被Git误添加的临时文件
|
3月前
|
开发工具 git iOS开发
服务器配置Huggingface并git clone模型和文件
该博客提供了在服务器上配置Huggingface、安装必要的工具(如git-lfs和huggingface_hub库)、登录Huggingface以及使用git clone命令克隆模型和文件的详细步骤。
313 1
|
4月前
|
开发工具 git
git如何不上传指定的文件或文件夹
【7月更文挑战第9天】平时写代码的时候有很多测试文件或者静态文件,没必要上传到git上,不仅占资源更新还麻烦,以下介绍如何忽略不需要上传的文件或文件夹。
401 8
|
4月前
|
开发工具 git
unable to index file ‘~$git提交版本号.xlsx‘
unable to index file ‘~$git提交版本号.xlsx‘