Git指南 第1部分:有关.git目录的所有信息



开始使用Git就像访问一个您不知道其语言的新国家一样。虽然很清楚自己的位置和去向,但一切都很好,但是如果迷路了,就会出现大问题。

互联网上发布了大量有关Git命令的教程,但是在本文中,对Git的工作进行了深入研究,而不仅仅是学习命令。

这是Mail.ru云解决方案团队翻译的Pierre de Wulf博客的Git指南第一部分。 

新用户发现很难适应Git。这是一个功能强大的工具,但不幸的是,它不是很容易学习。许多新概念,执行不同操作的命令(无论文件是否作为参数传递,反馈不清楚)...

可能克服所有这些困难的唯一方法是学习一些知识,而不仅仅是git commit / push,以了解Git的工作原理。

.Git文件夹


当您使用git init命令创建新存储库时,Git将创建一个魔术文件夹.git。它包含Git工作所需的一切。如果要从项目中删除Git,但将项目文件保留在磁盘上,只需删除.git文件夹。虽然谁可能需要这个?

    ├── HEAD
    ├── branches
    ├── config
    ├── description
    ├── hooks
    │ ├── pre-commit.sample
    │ ├── pre-push.sample
    │ └── ...
    ├── info
    │ └── exclude
    ├── objects
    │ ├── info
    │ └── pack
    └── refs
     ├── heads
     └── tags


这是您第一次提交之前典型.git文件夹的内容:

  1. HEAD-我们稍后会考虑。
  2. config — , , , url , , email . git config, .
  3. description — gitweb .
  4. hooks — , Git. , , / commit/rebase/pull… . push .
  5. 信息-排除 -此处描述了您不想包含在存储库中的文件。该文件的功能与.gitignore文件的功能相同,只是它没有传输到存储库中。实际上,.gitignore通常足以完成所有任务。

提交里面有什么?


每次创建文件并提交更改时,Git都会存档文件并将其存储在其数据结构中。使用唯一的名称创建一个已归档的对象,并将其存储在对象文件夹中。

在检查对象文件夹之前,我们先弄清楚什么是提交。提交是工作文件夹中文件当前状态的关键,但不仅限于此。

实际上,当您提交更改时,Git只会执行两件事:

  1. 如果工作文件夹中的文件未更改,则仅将压缩文件(哈希)的名称添加到快照。
  2. 如果工作文件夹中的文件已更改,它将对其进行压缩,然后将其放置在objects文件夹中,并将压缩文件(哈希)的名称添加到快照中。

当然,这里所有内容都以某种简化的方式进行了描述,但是,这足以理解正在进行的过程。

拍摄快照后,还将对其进行存档并用哈希命名,然后将其放置在objects文件夹中。

├── 4c
│ └── f44f1e3fe4fb7f8aa42138c324f63f5ac85828 // hash
├── 86
│ └── 550c31847e518e1927f95991c949fc14efc711 // hash
├── e6
│ └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391 // hash
├── info // let's ignore that
└── pack // let's ignore that too


这是我创建file_1.txt并提交后的对象文件夹。请注意,如果文件的哈希以“ 4cf44f1e ...”开头,则Git会将其名称保存为“ f44f1e ...”在名为“ 4c”的子文件夹中。因此,文件将被放置在256个子文件夹中,并且每个子文件夹不会包含太多文件。

如您所见,我们有三个哈希。一个用于file_1.txt,第二个用于提交时拍摄的快照。第三是做什么的?因为提交也是一个对象,所以创建了第三个哈希,它也被存档并放置在对象文件夹中。

您需要记住,提交包括四件事:

  1. 工作目录快照的名称(哈希)。
  2. 评论。
  3. 有关谁执行提交的信息。
  4. 父提交的哈希。

自己看看解压缩提交文件后会发生什么:

git cat-file -p 4cf44f1e3fe4fb7f8aa42138c324f63f5ac85828

这是您将看到的:

tree 86550c31847e518e1927f95991c949fc14efc711
author Pierre De Wulf 
<test[@gmail.com](mailto:pierredewulf31@gmail.com)> 1455775173 -0500
committer Pierre De Wulf 
<[test@gmail.com](mailto:pierredewulf31@gmail.com)> 1455775173 -0500
commit A

如预期的那样,您会看到快照的哈希,作者和提交的注释。这里有两点很重要:

  1. 快照“ 86550 ...”的哈希也是一个对象,可以在对象文件夹中看到。
  2. 由于这是第一次提交,因此它没有父提交。

图片到底是什么?

git cat-file -p 86550c31847e518e1927f95991c949fc14efc711
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 file_1.txt

在这里,我们看到对象存储中的对象,这是图片中唯一的对象。

分支,标签,HEAD是相同的


现在您了解了Git中的所有内容都可以通过正确的哈希获得。现在让我们看看HEAD。那有什么呢?

cat HEAD
ref: refs/heads/master

没有哈希,这很有意义,因为HEAD是指向正在使用的分支顶部的指针。如果查看文件refs / heads / master,您将看到:

cat refs/heads/master
4cf44f1e3fe4fb7f8aa42138c324f63f5ac85828
 

看起来很熟悉?自然,这是第一次提交的哈希值!这表明标记和分支只是指向提交的指针。了解了这一点,您可以删除所需的所有标签,所需的所有分支以及它们指向的提交将保留在原处。唯一的事情是,将很难访问它。如果您想进一步了解这一点,请查阅git book

最后评论


阅读后,对您来说显而易见的是,Git所做的只是存档您的工作文件夹,并将其与其他一些信息一起放入对象文件夹。如果您对Git足够熟悉,则可以完全控制哪些文件将包含在提交中,哪些文件将不包含在提交中。

我认为提交不是工作文件夹的快照,而是您要提交的文件的快照。Git在哪里存储您要提交的文件列表?它将此列表保存在索引文件中。我们将不会对此问题进行深入研究,如果您有兴趣,可以在此处找到更多详细信息

Mail.ru Cloud Solutions支持翻译

还有什么要读的

  1. GitLab CI中的简单缓存方法:图片指南
  2. -Agile .
  3. .


All Articles