Git本地仓库内部基本结构

Git本地仓库(本文不涉及远程仓库)的内部结构简单如下图:

这是一个appengine项目,刚从远程仓库中clone出来。这个目录下,除了.git目录外的都算作工作区。.git目录下有很多东西,这里只挑简单的描述。

1.objects目录存放的是实际的文件,当git add命令执行的时候,文件已经被存到了objects目录下。

.git/objects目录下的对象都有一个40位的id,前两位作为目录名,后38位作为文件名

.git/objects$ ls
00  06  0c  12  18  1f  26  2c  32  38  3e  44

这些对象主要是commit对象和tree对象(目录树)

2.index是一个索引文件。存放的是暂存区的整个目录树的信息,并且为目录树中的每个文件都保存了时间戳和长度。

当git add 将某个文件添加到暂存区的时候,index文件中添加了这个文件的基本信息。

当我们修改了工作区的某个文件(比如用touch config.js修改时间戳信息),这会导致该文件的时间戳发生变化,而index里面存放的仍然是旧的信息。

此时当我们执行git status命令来检查版本库的状况:

a. git status就会用config.js的时间戳和长度和index文件里面保存的config.js的时间戳和长度进行比较。

b. 如果相同,则认为没有改变。

c. 如果发现不同。git status会继续用config.js的文件现在的内容和旧版本的config.js(保存在.git/objects中)的内容进行比较。

d. 如果内容没有改变,就简单的将最新的config.js的时间戳信息更新到index文件中

e. 如果内容改变,则提示内容发生改变。但是并不更新index文件中的config.js的时间戳信息。

由于算法优先比较时间戳和长度,避免了当时间戳相同时的文件内容的比较,因此性能比较高。

因此,git add命令会做两件事情:

a.添加文件到暂存区(.git/objects)

b.添加文件索引到(.git/index)

3.当git commit被成功执行后,会产生一系列对象表示该commit的结果,都存储在.git/objects目录下。主要分成三部分:

a.tree对象表示当前commit时候的暂存区的目录树,tree对象的内容来自于.git/index文件。

b.blob对象

tree对象目录树中的文件总是以blob的对象被保存。如果tree中有三个文件,那么就有对应的三个blob对象,它们都能通过tree对象保存的这些blob对象的摘要信息(id,文件名,类型等)找到

c.commit对象

该对象记录了属于哪个tree对象,上一次commit的对象id,自己的id,作者等等。

因此,当git commit操作执行的时候,会:

a. 用.git/index文件保存的目录树创建tree对象,

b. 因此tree对象里面自然就指向了已经被git add添加到.git/objects中的blob文件。

c. .git/refs/heads/master文件保存了这次commit的id

4.HEAD文件保存了当前的branch,比如我的HEAD文件内容:

[email protected]:~/work/189/appengine/.git$ cat HEAD
ref: refs/heads/master

也就是说HEAD指向了master分支,如果存在多个分支,HEAD也可指向别的分支。

5. .git/refs 目录称为引用目录

引用就是一个文件,里面包含了一个commit id。.git/refs保存了所有的引用。

.git/refs/heads目录下保存的是分支引用,比如./git/refs/heads/master文件就是master分支的引用。

.git/refs/tags目录保存了tag引用。

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

原文地址:https://www.cnblogs.com/skiwnywh/p/10320210.html

时间: 2024-08-01 07:50:38

Git本地仓库内部基本结构的相关文章

Git 本地仓库(Repository)详解

大纲: 一.前言 二.概述 三.在Windows上安装Git 四.创建本地仓库 五.本地仓库管理详解 六.总结 注,测试机 CentOS 5.5 x86_64,Git 服务器版本:git version 1.8.2.1,客户端版本:git version 1.9.2.msysgit.0.所有软件请到这里下载:http://msysgit.github.io/. 一.前言 本来呢,其实呢.我以为Git也就几个命令,没什么难的.于是就到网上找了些文章看看,发现这些文章难得不知道该说什么好.不是简单的

[GIT]如何删除Git本地仓库

1.删除Git本地仓库 删除Git本地仓库的根本原理是删除“Git本地仓库”里面的根目录下面的隐藏文件夹“.git” (1)方法1:自己手动删除掉“Git本地仓库”里面的根目录下面的隐藏文件夹“.git”(如上图所示) (2)方法2:在本地仓库的目录下调用命令行删除根目录下的.git文件夹,输入 find . -name ".git" | xargs rm -Rf (3)检验是否成功删除了本地仓库:在Gitbash中进入仓库的目录中,如果目录末尾没有"(master)&quo

Git 本地仓库操作基本命令

1. 首先要配置用户信息配置(全局配置) $ git config --global user.name leo $ git config --global user.email [email protected] 2. 进入项目所在目录,git 初始化 ## 会在当前目录下创建隐藏的 .git 目录,用于 git 跟踪版本管理 $ git init 3. 将修改过的文件由工作区添加到暂存区(每次修改须重新添加) ## 添加单个文件 $ git add some.php ## 添加所有文件  

**Git本地仓库图解

Git基本概念 在Git中,我们将需要进行版本控制的文件目录叫做一个仓库(repository),每个仓库可以简单理解成一个目录,这个目录里面的所有文件都通过Git来实现版本管理,Git都能跟踪并记录在该目录中发生的所有更新. 现在我们已经知道什么是repository(缩写repo)了,假如我们现在建立一个仓库(repo),那么在建立仓库的这个目录中有一个“.git”的文件夹.这个文件夹非常重要,所有的版本信息,更新记录,以及Git进行仓库管理的相关信息全部保存在这个文件夹里面.所以,不要修改

Git本地仓库

原文:http://www.cnblogs.com/wilber2013/p/4189920.html Git基本概念 在Git中,我们将需要进行版本控制的文件目录叫做一个仓库(repository),每个仓库可以简单理解成一个目录,这个目录里面的所有文件都通过Git来实现版本管理,Git都能跟踪并记录在该目录中发生的所有更新. 现在我们已经知道什么是repository(缩写repo)了,假如我们现在建立一个仓库(repo),那么在建立仓库的这个目录中有一个“.git”的文件夹.这个文件夹非常

Git如何克隆Gitlab?Git本地仓库如何上传Gitlab?

首先确保本机已经安装上Git,其次确认可以正常访问Gitlab服务器 环境: Git:Centos 7.x  192.168.126.138 Gitlab: Centos7.x 192.168.126.137 1:填写Gitlabn仓库信息 登陆到Gitlab服务器地址,新建仓库 创建成功后会自动跳转至该仓库的页面: 上面红色框内,是仓库地址,我们尝试把仓库克隆到本地仓库: [[email protected] 123]#git clone http://192.168.126.137/root

git 本地仓库信息的查询

本地仓库信息查询操作 1.1  git status 查看当前暂存区状态 git  status 显示当前分支信息: 提交的目的分支信息: git 管理的有修改的文件: 当前仓库未被 git 管理的文件: 1.2  git log 查看版本演变历史 1.2.1  git  log (不带参数) 查看当前分支所有的提交记录日志的详细信息 git  log  提交的ID号: 提交的分支信息: 提交的操作者信息和时间信息: 1.2.2 git  log  -n数字 查看当前分支最近指定次数的提交记录日

创建git本地仓库和GitHub远程仓库并配置连接的从无到有

一:初始化本地仓库 选择一个工程目录终端打开 git init 初始化本地仓库 如果没有设置过邮箱和姓名还需要设置邮箱姓名,保持与GitHub一致 git config --global user.email "邮箱" git config --global user.name "姓名" git add . git commit 在这之后才可以git branch 或者 git checkout命令 二:配置SSH 生成ssh ssh-keygen -t rsa -

git本地仓库和远程仓库关联

1.创建远程仓库 2.初始化本地仓库git init     git add .     git commit  -m "desc" 3.关联远程仓库  git remote add origin https://gitee.com/lp369/mypython.git 4.第一次先拉取远程库中的README.md和.gitignore等文件     git pull --rebase origin master 5.提交本地代码git push origin master 原文地址: