git原理笔记(一)

article/2025/9/11 17:23:50

git原理笔记(一)

这个笔记是对于git内部原理的一个理解。网上很多关于git的用法的教程。这里推荐廖雪峰的git教程。

这里主要记录如下的内部原理的理解
1. git如何存储
2. git如何管理版本


一. git如何存储

常常在使用git的过程中,一直在思考,git到底是如何存储我们提交的这些代码的。后来通过种种学习,发现,git将我们的所有东西都放在了.git目录下。那么.git目录下有什么东西呢。下面是随便建立的一个git库下面的.git目录
这里写图片描述

目录简要说明如下:
branches——以前用来指定一个URL去fetch,pull,push的一个快捷方式,不过现在不用了
config——当前项目的配置文件,包括怎么去fetch,push等。后面再引用格式中会提到
description——仅供gitweb程序使用的描述性文件
HEAD——存储HEAD引用指向的位置,后面有提到引用的概念
hooks——这个目录包含的是shell脚本,相应的git命令执行时,这些脚本会被回调。
info——记录当前库的额外信息
objects——真正保存数据的地方
refs——存放引用的地方

1.1 使用底层命令,向git存数据

在平时的使用中,都是通过,git commit将数据存入本地库中。为了查看git的存储原理,这里使用git hash-object命令,将数据直接写入git的库中。向git库中存入,一个wanbiao的内容。如下
这里写图片描述

-w表示写入,–stdin表示从标准输入中读入数据内容,否则,后面跟上文件路径。文件就是需要存储的内容
前面说过,objects目录用来存放数据,那么,我们去objects目录下看看有什么东西没有。

这里写图片描述
发现在objects下面多了一个cc目录,并且多了一个文件。将目录名字和文件名字拼接在一起,就是git hash-object输出的内容。
这是因为:向git写入数据的时候,会得到一个sha-1的校验和。然后以这个校验和的前两位为目录名,后38位为文件名,然后再将数据内容写入这个文件中,本例中数据内容就是字符串“wanbiao”。
使用git cat-file 查看如下:
这里写图片描述

这里有必要提一下,这40个字符怎么来的。
git使用{数据类型+数据长度+\0+数据内容},获得相应额SHA-1的值。
为了说明此情况,这里引用git官网上面的ruby代码来演示。

这里写图片描述

1.2 git的内部数据类型

在上面中,保存了数据,如果这个是一个文件,文件内容我们可以按上述的方法保存,但是文件的名字怎么保存呢。此时,在git内部中,使用了如下的类型来保存不同的数据。
1. blob
2. tree
3. commit
4. tag
blob类型表示,数据内容
tree类型表示,目录内容
commit类型表示,提交内容
tag类型表示,标签内容
要查看数据类型,可以使用
git cat-file -t如下
这里写图片描述
接下来,我们将前面的wanbiao内容,放入一个name的文件中。
因此,这里应该使用tree类型,使用git write-tree创建tree对象,因为一个tree对象中可以用很多的类型,比如blob,还有其他的tree,因此,git write-tree之前,需要将放入tree对象中的东西,放在一个暂存区中。使用命令 git update-index 放入暂存区。演示如下:
这里写图片描述
对于git update-index的用法如下:

这里写图片描述
git write-tree,将当前暂存区中的内容,保存为一个tree对象,这个tree对象,被存储的方式与blob对象一样,也是讲前两位作为目录,后38位作为文件。因此我们在objects里面可以看一下,如下:
这里写图片描述
再看看这个tree对象的内容
git cat-file -p如下:
这里写图片描述

有了上面的tree对象之后,就可以创建一个commit对象了,这个对象用于保存当前提交的一些信息,使用git commit-tree,来创建tree对象如下:
这里写图片描述
查看内容使用,git cat-file -p 如下:
这里写图片描述
可以看到提交者的详细信息。使用如下命令来查看提交记录:
这里写图片描述

没有使用git add,git commit,就已经成功的创建了一个提交。这里为什么没有直接使用git log,是因为当前的引用,还没有配置好。这个留到下一节来记录,即,git如何管理版本.下图我们创建的对象的一个关系图:
这里写图片描述
我们再创建一个提交,如下的操作
这里写图片描述

1.3 git如何管理各个版本之间的差异

在上面的所有数据,每次提交都是一个新的内容。如果我们修改了一个文件,那么git是如何管理这个文件的呢?我能想到的方法是:1.每次都保存这个新修改的文件。2.保存的仅仅是两个文件的差分。
第一种情况就会增加非常大的存储。比如我又一个10M的文件。但是我只是在某一次提交中,改变了一下这个文件的最后一行。如果每次都保存新修改的文件。那么10M的文件肯定有两个,这非常消耗存储。
我来测试一下git到底使用的是那种模式来管理的。这里准备一个大文件。将其加入git中,然后修改一小部分,在次提交,看看git内部数据存储的变化
首先增加一个大文件
这里写图片描述
我们现在稍微更改一下。在提交看看git的大小
这里写图片描述
从size一行可以看出,虽然我们只改变了TextView.java的最后一行,但是git每次都保存了完整的文件内容。
因此,可以推断git就是把每个文件都保存了一份。git肯定会占用很大的存储空,事实也是如此,当你从其他的保存差分的版本控制系统,迁移到git的时候,git会占用更多的空间。
那么,git能不能优化一下呢?答案是肯定得。通过运行git gc,进行优化。这里尝试一下,如下结果
这里写图片描述
size的大小变成了108减少了几乎一半的大小。那么git到底做了什么操作,才减少了操作。
在最开始提过,git将数据放在objects目录下,现在看看objects下面是什么样子
这里写图片描述

发现有4个对象,这四个对象,分别是2个commit对象,一个tree对象,
一个blob对象。并且info和pack目录下面多了内容。通过git cat-file -p 命令查看blob对象,就会发现,这个对象保存的是当前最新的文件的内容。那么以前的内容上哪里去了?
答案就是:在pack里面。pack下面有两个文件一个.idx文件,一个.pack文件。.pack文件保存的是各个对象打包之后的数据。因为所有的对象都保存在一个文件,为了区分他们,有了idx文件,这个文件保存有偏移量,类型,以及大小。使用git verify-pack -v命令进行查看。如下:
这里写图片描述
可以看到,里面有两个对象,一个blob对象,一个tree对象。
注意:从git官网的资料来看,这个blob对象的大小应该为差分的大小,即pack里面存储的内容应该是TextView.java两次修改产生的差分。但是笔者在这里TextView就不是保存的差分,也试过保存二进制文件,显示的也不是差分。此处视乎更官网有些差别
至于为什么会出现这种差异,有待后面考证。

那么这里总结一下(官网说法):git 每次都对修改的整个文件进行全部保存,当触发了git gc,那么,会对非悬空对象进行打包,打包文件中,保存的是各个版本之间的差异,因此可以节省内存。
实际情况:git每次对修改的整个文件进行全部保存,当触发了git gc之后,对非悬空对象进行打包,打包文件中,保存的还是整个文件的内容,并没有减少。(有待下一步研究)


http://chatgpt.dhexx.cn/article/4ugArA6T.shtml

相关文章

git工作原理

一. git工作原理 二. git分支标准流程 三. git工具:sourcetree 待续知识分享

git原理和常用命令

git git介绍git工作流程git的几个核心概念 git常用命令参考资料 git介绍 git-分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。 git特点 优点: 适合分布式开发,强调个体; 公共服务器压力和数据量都不会太…

Git分支原理

Git分支原理 前言 最近工作由SVN换成Git了,不由地想探寻一下这两种版本控制工具的差别到底在哪里,于是有了这篇笔记。 Git保存方式 Git和SVN的差别主要就在于对待数据的方式。 SVN将存储的信息看作是一组基本文件和每个文件随时间逐步累积的差异&…

git fetch工作原理

背景 相信大家都知道git pull命令相当于git fetch加git merge。那么直接使用git pull和分开使用有什么区别呢&#xff1f;要解答这个问题首先要想了解git fetch的工作原理是什么样的。 git fetch的工作原理 先讲一下什么是远程跟踪分支。远程跟踪分支以 <remote>/<…

Git原理入门解析

前言: 自己第一次听到Git应该是一年前了,当时很懵,不知道它是干啥的,在网上搜索了很多文章,一直不是太明白;今天我来记录一下自己对Git的学习,如果对其他童鞋有所帮助,我荣幸之至! 一、Git 简析 Git是什么? Git是目前世界上最先进的分布式版本控制系统(没有之一)。…

Git原理详解与实用指南

文章目录 上手 1&#xff1a;新公司用 Git 管理代码&#xff0c;怎么快速上手&#xff1f;上手2&#xff1a;团队工作的基本工作模型进阶1&#xff1a;HEAD、master与branch进阶2&#xff1a;push的本质进阶3&#xff1a;merge&#xff1a;合并commits进阶4&#xff1a;Feature…

最详细的Git原理总结+如何解决冲突

原文路径是https://www.cnblogs.com/cb0327/p/5066685.html 目录 1.提交 代码到远程仓库2.将远程仓库代码更新到本地3.更新到本地仓库时&#xff0c; 出现冲突&#xff0c;解决冲突后记&#xff1a; 正文 本文背景&#xff0c;在实际项目中使用git已有一年&#xff0c;发现不少…

图解git工作原理

git 是一个能处理各种大小项目的开源版本控制系统&#xff0c;本文想通过两张图来简单说明git的工作原理 从上图可以知道git分四个部分来记录文件状态 working directory:工作区&#xff0c;开发者直接修改的本地代码树 staging area&#xff1a;暂存区&#xff0c;用于临时保存…

git原理解释

工作区域 Git本地有三个工作区域&#xff1a;工作目录&#xff08;Working Directory&#xff09;、暂存区&#xff08;Stage/Index&#xff09;、本地仓库&#xff08;Repository或Git Directory&#xff09;。如果在加上远程的Git仓库&#xff08;Remote Directory&#xff0…

git的基本原理

刚刚接触到git和github&#xff0c;整理一部分相关原理帮助自己理解git命令和本地-远程的操作。 我们将这部分学习分为三部分&#xff1a;&#xff08;1&#xff09;本地仓库相关操作&#xff08;2&#xff09;远程仓库相关操作&#xff08;3&#xff09;本地-远程交互操作 本地…

Git原理及操作简介

Git原理及操作简介 一、Git是什么 Git是目前世界上最先进的分布式版本控制系统 工作原理 / 流程: Workspace:工作区 Index / Stage:暂存区 Repository:仓库区(或本地仓库) Remote:远程仓库 二、SVN与Git的最主要的区别? SVN是集中式版本控制系统,版本库是集中放在中…

Git 工作原理

Git 工作原理 GIt简介Git 的基本原理Git的目录结构Git对象在之前我们提到过&#xff0c;Git是一套内容寻址&#xff08;content-addressable&#xff09;文件系统&#xff0c;那么Git是怎么进行寻址呢&#xff1f;Git对象的类型包括&#xff1a;BLOB、tree对象、commit对象。 对…

一文搞明白GIT——Git原理解析与常用命令

工作中经常用git&#xff0c;但是不少命令经常使用出现各种各样的问题&#xff0c;也不太理解其中的原理。今天专门总结一下git的原理&#xff0c;理解原理之后想实现什么样的功能直接找相应的命令即可。如有错误和不足&#xff0c;欢迎指正&#xff01; 一、 工作区 使用git…

Git 原理详解及实用指南

Git 原理详解及实用指南 什么是版本控制系统&#xff08;VCS&#xff09; 很多人认为 Git 难以理解的第一个门槛在于&#xff1a;所谓的「Git 是一个分布式版本控制系统」这句话的具体含义不够清楚。其实分布式版本控制系统&#xff08;Distributed Version Control System - …

图解git原理

用了这么久git&#xff0c;你有没有想过git的原理是什么&#xff1f;为什么git做回退这么快&#xff1f;创建、切换分支也这么快&#xff1f;git的工作区、暂存区、本地仓库、远程仓库都分别对应怎样的实体&#xff1f;打开一个git仓&#xff0c;看看目录下的.git文件夹&#x…

Git 的原理

文章目录 什么是 Git&#xff1f;版本库是由什么构成的版本库&#xff08;项目文件夹&#xff09;的构成版本库&#xff08;对象数据库&#xff09;的结构提交的组成SHA1 算法 总结 暂存区什么样的文件&#xff0c;不应该上传到版本库中&#xff1f;查看暂存区清空暂存区选择性…

Git学习之git原理

git对象 当我们使用git进行版本管理时&#xff0c;git会将我们的文件和目录结构转化成git方便操作的数据(git对象)&#xff0c;然后再对这些git对象进行管理&#xff0c;从而实现版本管理的目的&#xff0c;这些git对象存放在git的对象库中。 我们眼中的文件会被git转化成&qu…

Git 必知必会:原理剖析

作为程序员&#xff0c;最常用的版本管理工具便是 Git。但我相信大多数人和我一样&#xff0c;从没有认真了解过其具体实现的原理。但了解 Git 的原理&#xff0c;能有助于我们工作更好的使用 Git。下面&#xff0c;让我们一起来了解 Git 中的一些概念&#xff0c;以及实现。 一…

git 原理简介

文章目录 关于版本控制分为三种版本控制方案本地版本控制集中化的版本控制分布式版本控制 git基本底层原理git提交流程原理Git的引用(分支)git log原理总结参考链接 关于版本控制 什么是“版本控制”&#xff1f;我为什么要关心它呢&#xff1f; 版本控制是一种记录一个或若干文…