Git内部构件的可视指南-对象,分支以及如何从头开始创建存储库

2020年12月30日10:50:22 发表评论 33 次浏览

我们许多人使用吉特以一天为周期。但是我们当中有多少人知道引擎盖下发生了什么?

例如, 当我们使用git提交?两次提交之间存储了什么?这只是当前提交与先前提交之间的区别吗?如果是这样, 差异如何编码?还是每次都存储整个回购快照?当我们使用时真正发生了什么git初始化?

许多人使用吉特不知道以上问题的答案。但这真的重要吗?

首先, 作为专业人士, 我们应该努力了解我们使用的工具, 尤其是如果我们一直在使用它们的话。吉特.

但更为尖锐的是, 我发现了解git的实际工作方式在许多情况下都是有用的-不论是解决合并冲突, 寻求进行有趣的基础调整, 还是只是在出现某些错误时。

如果你有足够的经验, 就会从这篇文章中受益吉特适应以下命令git pull, git推, git添加orgit提交.

不过, 我们将从概述开始, 以确保我们在同一页面上了解有关吉特, 尤其是整个帖子中使用的术语。

我还上传了一个涵盖此帖子的YouTube系列影片, 欢迎你观看这里.

对于几乎每天都会做的事情, 我们将获得很少的了解。

我们将首先覆盖对象start斑点, 树木, 和提交。然后我们将简要讨论分行以及如何实施我们将深入工作目录, 暂存区和资料库.

并且我们将确保我们了解这些术语与吉特我们知道并用于创建新存储库的命令。

接下来, 将从头开始创建一个存储库-不使用git初始化, git添加, 要么git提交。这将使我们能够加深我们对引擎盖下正在发生的事情的了解当我们与吉特.

我们还将创建新分支, 切换分支并创建其他提交。git分支orgit结帐.

在这篇文章的结尾, 你会感觉像你理解 吉特。你准备好了吗? 😎

考虑一下非常有用吉特就像维护文件系统一样, 特别是及时地快照该系统的快照。

文件系统以根目录(在基于UNIX的系统中, /), 通常包含其他目录(例如, / usror/箱)。这些目录包含其他目录和/或文件(例如, /usr/1.txt)。

In吉特, 文件的内容存储在称为斑点, 二进制大对象。

和...之间的不同斑点文件是文件还包含元数据。例如, 文件在创建时会"记住", 因此, 如果将该文件移动到另一个目录中, 其创建时间将保持不变。

斑点另一方面, 只是内容二进制数据流。一种斑点除了其内容外, 不注册其创建日期, 名称或其他任何内容。

每一个斑点in吉特由其标识SHA-1哈希。 SHA-1散列由20个字节组成, 通常以40个字符以十六进制形式表示。在整个这篇文章中, 有时我们只会显示该哈希的第一个字符。

斑点具有与之关联的SHA-1哈希

In吉特, 相当于目录是树。一种树基本上是目录列表, 指的是斑点以及其他树木.

树木也由其SHA-1散列确定。引用这些对象, 或者斑点或其他树木, 是通过对象的SHA-1哈希值发生的。

树是目录列表

请注意树 咖啡馆7指的是斑点F92A0aspic.png。在另一个树, 一样斑点可能有另一个名字。

一棵树可能包含子树以及斑点

上图等效于一个文件系统, 该文件系统的根目录在其中包含一个文件/test.js, 以及一个名为/ docs有两个文件:/docs/pic.png和/docs/1.txt.

现在是时候对该文件系统进行快照了, 并存储了当时存在的所有文件及其内容。

In吉特, 快照是承诺。一种承诺对象包括指向主对象的指针树(根目录)以及其他元数据, 例如提交者, 一种承诺消息和承诺时间。

在大多数情况下, 承诺也有一个或多个父母提交— —以前的快照。当然, 承诺对象也通过其SHA-1哈希值进行标识。这些是我们使用时经常会看到的哈希git日志.

提交是时间的快照。它指的是根树。由于这是第一次提交,因此它没有父代。

每一个承诺持有整个快照, 而不仅仅是与以前的差异提交.

那怎么行?这是否意味着每次提交都必须存储大量数据?

让我们研究一下如果更改文件内容会发生什么。说我们编辑1.txt, 并添加一个感叹号, 即我们将内容从你好, 世界, 至你好, 世界!.

好吧, 这种变化意味着我们有了一个新的一滴使用新的SHA-1哈希。这是有道理的, 因为sha1(" HELLO WORLD")与...不同sha1(" HELLO WORLD!").

更改Blob会产生新的SHA-1

由于我们有了新的哈希, 因此树的列表也应该更改。毕竟, 我们的树不再指向斑点73D8A, 反而斑点62E7A代替。随着我们改变树的内容, 我们还更改了其哈希值。

Git内部构件的可视指南-对象,分支以及如何从头开始创建存储库1

指向更改的Blob的树也需要更改

而现在, 由于树是不同的, 我们还需要更改父对象树-因为后者不再指向树CAFE7, 反而树24601. 因此, 父母 树也将有一个新的哈希。

根树也会更改,其哈希也将更改。

几乎准备创建一个新的承诺对象, 似乎我们要存储很多数据-整个文件系统, 再一次!但这真的有必要吗?

实际上, 有些对象, 特别是斑点对象, 自上一次提交以来未更改斑点F92A0保持完好无损Blob F00D1。

因此, 这就是窍门–只要对象不变, 我们就不会再次存储它。在这种情况下, 我们不需要存储斑点F92A0和斑点F00D1再一次。 我们仅通过其哈希值来引用它们。然后我们可以创建我们的承诺目的。

Git内部构件的可视指南-对象,分支以及如何从头开始创建存储库2

保持完整的Blob由其哈希值引用

从此承诺不是第一个承诺, 它有一个父母提交A1337.

因此, 回顾一下, 我们引入了三个git对象:

  • blob —文件内容。
  • 树—目录列表(的斑点和树木)。
  • 承诺—工作树的快照。

让我们稍微考虑一下这些对象的哈希值。假设我写了字符串git很棒!并创建了一个斑点从中。你在系统上执行了相同的操作。我们会有相同的哈希值吗?

答案是:是。自从斑点包含相同的数据, 它们将具有相同的SHA-1值。

如果我做了一个树引用了斑点ofgit很棒!, 并为其指定了特定的名称和元数据, 你在系统上所做的操作完全相同。我们会有相同的哈希值吗?

再说一次。自从树木对象是相同的, 它们将具有相同的哈希值。

如果我创建了一个承诺在那树与提交消息你好, 并且你在系统上执行了相同的操作。我们会有相同的哈希值吗?

在这种情况下, 答案是—否。即使我们承诺对象指的是相同的树, 他们有不同承诺详细信息-时间, 提交者等。

分支只是对提交的命名引用.

我们总是可以引用一个承诺通过其SHA-1哈希值, 但人类通常更喜欢使用其他形式来命名对象。一种科是引用一个的一种方法承诺, 但实际上就是如此。

在大多数存储库中, 开发的主线是在一个名为主。这只是一个名称, 是我们使用时创建的git初始化, 使其得到广泛使用。但是, 这绝非特殊, 我们可以使用其他任意名称。

通常, 分支指向最新承诺我们目前正在开发中。

分支只是对提交的命名引用

要创建另一个分支, 我们通常使用git分支命令。通过这样做, 我们实际上创建了另一个指针。因此, 如果我们创建一个名为测试, 通过使用git分支测试, 我们实际上是在创建另一个指向相同指针的指针承诺作为我们当前所在的分支。

Git内部构件的可视指南-对象,分支以及如何从头开始创建存储库3

使用`git branch`创建另一个指针

如何吉特知道我们目前在哪个分支?它保留了一个称为头。通常, 头指向分支, 而分支又指向承诺。在某些情况下, 头也可以指向承诺直接, 但我们不会专注于此。

Git内部构件的可视指南-对象,分支以及如何从头开始创建存储库4

HEAD指向我们当前所在的分支。

将活动分支切换为测试, 我们可以使用命令git checkout测试。现在我们已经可以猜到此命令的实际作用了……头指向测试.

Git内部构件的可视指南-对象,分支以及如何从头开始创建存储库5

git checkout test更改了HEAD指向的位置

我们也可以使用git checkout -b测试在创建之前测试分支, 相当于运行git分支测试创建分支, 然后git checkout测试移动头指向新分支。

如果我们进行一些更改并创建新的内容会发生什么承诺使用git提交?新的哪个分支承诺被添加到?

答案是测试分支, 因为这是活动分支(自头指向它)。之后, 测试指针将移至新添加的承诺。注意头仍然指向测试.

Git内部构件的可视指南-对象,分支以及如何从头开始创建存储库6

每次我们使用git commit时, 分支指针将移至新创建的提交。

所以如果我们回去掌握git checkout主, 我们走头指向主再次。

Git内部构件的可视指南-对象,分支以及如何从头开始创建存储库7

现在, 如果我们创建另一个承诺, 它将被添加到主分支(其父节点为犯B2424)。

Git内部构件的可视指南-对象,分支以及如何从头开始创建存储库8

通常, 当我们处理源代码时, 我们会从工作目录。一种工作目录(要么工作树) 是我们文件系统上任何具有资料库与之相关。它包含我们项目的文件夹和文件, 以及一个名为.git稍后我们将详细讨论。

进行一些更改后, 我们希望将其记录在我们的资料库。一种资料库(简而言之:回购)是提交, 每个文件都是项目内容的存档工作树看起来就像过去的日期, 无论是在我们的机器上还是在其他人的机器上。

一种资料库还包括我们的代码文件以外的内容, 例如头, 分支机构等。

Git内部构件的可视指南-对象,分支以及如何从头开始创建存储库9

与你可能使用过的其他类似工具不同, 吉特不提交来自工作树直接进入资料库。相反, 更改首先会记录在称为编号, 或者暂存区.

这两个术语指的是同一件事, 并且经常在吉特的文档。在本文中, 我们将互换使用这些术语。

什么时候我们查看分店, 吉特填充编号以及最后签出到我们的所有文件内容工作目录以及最初签出时的外观。当我们使用git提交, 承诺是根据状态编号.

使用编号让我们精心准备每个承诺。例如, 自上一个文件以来, 我们可能有两个文件有更改承诺在我们的工作目录。我们只能将其中之一添加到编号(使用git添加), 然后使用git提交仅记录此更改。

Git内部构件的可视指南-对象,分支以及如何从头开始创建存储库10

我们的文件工作目录可以处于以下两种状态之一:已追踪or未追踪.

追踪档案是那些吉特知道。他们要么在最后一个快照中(承诺), 或者上演现在(也就是说, 他们在暂存区)。

未跟踪的文件还有其他一切吗?工作目录不在我们上一个快照中(承诺), 并且不在我们的暂存区.

确保我们了解引入的术语与创建广告的过程之间的关系。资料库。在我们更深入地研究该过程之前, 这只是一个快速的高级视图。

注意:大多数包含shell命令的文章都显示UNIX命令。为了方便起见, 我将提供Windows和UNIX的命令以及Windows的屏幕截图。当命令完全相同时, 我将只提供一次。

我们将初始化一个新的资料库使用git init repo_1, 然后使用将目录更改为存储库的目录cd repo_1。通过使用树/ f .git我们可以看到跑步git初始化导致里面有很多子目录.git。 (标志/f包含文件树的输出)。

Git内部构件的可视指南-对象,分支以及如何从头开始创建存储库11

让我们在repo_1目录:

Git内部构件的可视指南-对象,分支以及如何从头开始创建存储库12

在Linux系统上:

Git内部构件的可视指南-对象,分支以及如何从头开始创建存储库13

该文件在我们的工作目录。但是, 由于我们尚未将其添加到暂存区, 目前未追踪。让我们验证使用git状态:

Git内部构件的可视指南-对象,分支以及如何从头开始创建存储库14

由于我们尚未将新文件添加到暂存区域, 因此未跟踪新文件, 并且该文件未包含在上一次提交中

现在, 我们可以将此文件添加到暂存区通过使用git添加new_file.txt。我们可以通过运行来验证它是否已登台git状态:

Git内部构件的可视指南-对象,分支以及如何从头开始创建存储库15

将新文件添加到暂存区

我们现在可以创建一个承诺使用git提交:

Git内部构件的可视指南-对象,分支以及如何从头开始创建存储库16

内部有什么变化.git目录?开始吧树/ f .git去检查:

Git内部构件的可视指南-对象,分支以及如何从头开始创建存储库17

.git中的很多事情都发生了变化

显然, 已经发生了很多变化。现在该深入了解.git并了解我们跑步时引擎盖下发生的事情git初始化, git添加orgit提交.

到目前为止, 我们已经介绍了一些Git基础知识, 现在我们已经准备好真正步履蹒跚。

为了深入了解吉特作品, 我们将创建一个资料库, 但是这次-我们将从头开始构建它。

我们不会使用git初始化, git添加orgit提交这将使我们对流程有更好的动手理解。

让我们创建一个新目录并运行git状态其中:

Git内部构件的可视指南-对象,分支以及如何从头开始创建存储库18

好啦吉特似乎不开心, 因为我们没有.git夹。自然要做的就是简单地创建该目录:

Git内部构件的可视指南-对象,分支以及如何从头开始创建存储库19

显然, 创建一个.git目录仅仅是不够的。我们需要向该目录添加一些内容。

一种 git存储库有两个主要组件:

  1. 对象集合-斑点, 树木和提交.
  2. 命名这些对象的系统-称为参考资料.

一种资料库可能还包含其他内容, 例如git hooks, 但至少-必须包含对象和引用。

让我们为位于以下位置的对象创建目录.git \对象和参考目录(简而言之:裁判) 在.git \ refs(在基于UNIX的系统上-.git /对象和.git /引用, 分别)。

Git内部构件的可视指南-对象,分支以及如何从头开始创建存储库20

一种参考是分行。在内部, 吉特来电分行按名字头。因此, 我们将为他们创建一个目录-.git \ refs \ heads.

Git内部构件的可视指南-对象,分支以及如何从头开始创建存储库21

这仍然不会改变我们的git状态:

Git内部构件的可视指南-对象,分支以及如何从头开始创建存储库22

如何吉特在寻找一个时知道从哪里开始承诺在里面资料库?如前所述, 它寻找头, 它指向当前的活动分支(或承诺, 在某些情况下)。

因此, 我们需要创建头, 这只是位于.git \ HEAD。我们可以应用以下内容:

在Windows上:>回声ref:refs / heads / master> .git \ HEAD

在UNIX上:$ echo" ref:refs / heads / master"> .git / HEAD

⭐所以我们现在知道如何头已实现-它只是一个文件, 其内容描述了它所指向的内容。

按照上面的命令, git状态似乎改变了主意:

Git内部构件的可视指南-对象,分支以及如何从头开始创建存储库23

HEAD只是一个文件

注意吉特相信我们在一个名为主, 即使我们尚未创建此分支。正如之前所提, 主只是一个名字。我们也可以吉特相信我们在一个叫做香蕉如果我们想:

Git内部构件的可视指南-对象,分支以及如何从头开始创建存储库24

🍌

我们将切换回主在本帖子的其余部分中, 只需遵守常规约定即可。

现在我们有了.git目录已准备就绪, 我们可以按自己的方式制作一个承诺(再次, 不使用git添加orgit提交)。

在这一点上, 区分两种类型的吉特命令:水暖和瓷。这些术语的应用奇怪地来自于传统上用瓷器制成的厕所(是的, these), 以及管道的基础设施(管道和下水道)。

可以说, 瓷层为管道提供了用户友好的界面。大多数人只处理瓷器。但是, 当事情(非常糟糕)出错并且某人想了解原因时, 他们将不得不卷起袖子检查管道。 (注意:这些术语不是我的, 它们在吉特)。

吉特使用该术语作为类比, 将用户通常不需要直接使用的低级命令("管道"命令)与用户更友好的高级命令("瓷器"命令)分开。

到目前为止, 我们已经处理了瓷器命令-git初始化, git添加orgit提交。接下来, 我们过渡到管道命令。

让我们从创建对象开始并将其写入对象的数据库吉特, 位于.git \对象。我们将找到a的SHA-1哈希值斑点通过使用我们的第一个管道命令, git哈希对象, 方法如下:

在Windows上:

> echo git很棒| git hash-object --stdin

在UNIX上:

$ echo" git很棒" | git hash-object --stdin

通过使用--stdin我们正在指导git哈希对象从标准输入中获取其输入。这将为我们提供相关的哈希值。

为了写出来斑点进入吉特的对象数据库, 我们只需添加-w切换为git哈希对象。然后, 我们可以检查.git文件夹, 然后查看它们是否已更改。

Git内部构件的可视指南-对象,分支以及如何从头开始创建存储库25

将Blob写入对象的数据库

现在我们可以看到我们的哈希值斑点是-54f6 ... 36。我们还可以看到已经在下面创建了目录.git \对象, 一个名为54以及其中的一个文件, 名称为f6 ... 36.

So吉特实际上使用SHA-1哈希的前两个字符并将它们用作目录的名称。其余字符用作实际包含以下内容的文件的文件名:斑点.

为什么?考虑一个相当大的存储库, 其中包含300, 000个对象(斑点, 树木和提交)在其数据库中。要在300, 000个哈希列表中查找哈希, 可能需要一段时间。从而, 吉特只需将该问题除以256。

要查找上面的哈希, 吉特首先将查找名为54在目录内.git \对象, 最多可包含256个目录(00通过FF)。然后, 它将搜索该目录, 从而缩小搜索范围。

回到我们生成承诺。现在, 我们创建了一个对象。该对象的类型是什么?我们可以使用另一个管道命令, git cat文件-t(-t代表"类型"), 请查看以下内容:

Git内部构件的可视指南-对象,分支以及如何从头开始创建存储库26

毫不奇怪, 这个对象是一个斑点。我们也可以使用git cat文件-p(-p代表"漂亮打印")以查看其内容:

Git内部构件的可视指南-对象,分支以及如何从头开始创建存储库27

创建一个斑点通常发生在我们向暂存区-也就是说, 当我们使用git添加.

请记住吉特创建一个斑点的整个已暂存的文件。即使修改或添加了单个字符(如我们添加的!在我们之前的示例中), 文件有一个新斑点用新的杂凑.

会不会有任何变化git状态?

Git内部构件的可视指南-对象,分支以及如何从头开始创建存储库28

显然没有。添加一个斑点反对吉特内部数据库不会更改状态, 因为吉特目前不知道任何跟踪或未跟踪的文件。

我们需要跟踪此文件-将其添加到暂存区。为此, 我们可以使用管道命令git更新索引, 就像这样:git update-index --add --cacheinfo 100644 <blob哈希> <文件名>.

注意:(缓存信息是16位文件模式由git存储, 按照以下布局POSIX类型和方式。这不在本文的讨论范围之内。

运行上面的命令将导致更改为.git的内容:

Git内部构件的可视指南-对象,分支以及如何从头开始创建存储库29

你能发现变化吗?名称为的新文件编号已创建。就是这样-著名编号(要么暂存区), 基本上是一个驻留在其中的文件.git \ index.

所以现在我们斑点已添加到编号, 我们期盼git状态看起来像这样:

Git内部构件的可视指南-对象,分支以及如何从头开始创建存储库30

那很有意思!这里发生了两件事。

首先, 我们可以看到new_file.txt以绿色显示在更改要提交区。那是因为编号现在有new_file.txt, 等待承诺。

其次, 我们可以看到new_file.txt显示为红色-因为吉特相信文件 my_file.txt已被删除, 并且该文件已被删除的事实没有上演。

当我们添加了斑点与内容git很棒到对象的数据库, 并告诉编号该文件my_file.txt具有该内容斑点, 但我们从未真正创建过该文件。

我们可以通过采用以下内容轻松解决此问题斑点, 然后将它们写入我们的文件系统, 称为my_file.txt:

Git内部构件的可视指南-对象,分支以及如何从头开始创建存储库31

结果, 它将不再以红色显示git状态:

Git内部构件的可视指南-对象,分支以及如何从头开始创建存储库32

因此, 现在该创建一个承诺来自我们的对象暂存区。如上所述, 承诺对象具有对树, 因此我们需要创建一个树.

我们可以使用以下命令git写树, 它记录了编号在一个树目的。当然, 我们可以使用git cat文件-t看到它确实是一个树:

Git内部构件的可视指南-对象,分支以及如何从头开始创建存储库33

创建索引的树对象

我们可以使用git cat文件-p查看其内容:

Git内部构件的可视指南-对象,分支以及如何从头开始创建存储库34

太好了, 因此我们创建了一个树, 现在我们需要创建一个承诺引用此的对象树。为此, 我们可以使用git commit-tree <树哈希> -m <提交消息>:

Git内部构件的可视指南-对象,分支以及如何从头开始创建存储库35

现在, 你应该对用于检查已创建对象的类型并打印其内容的命令感到满意:

Git内部构件的可视指南-对象,分支以及如何从头开始创建存储库36

创建一个提交对象

请注意承诺没有一个父母, 因为这是第一个承诺。当我们添加另一个承诺我们将不得不宣布其父母-我们将在以后进行。

我们得到的最后一个哈希-80e ... 8f–是承诺的哈希值。实际上, 我们已经习惯了使用这些哈希值-我们一直都在研究它们。请注意承诺拥有一个树具有自己的哈希的对象, 我们很少对其进行明确指定。

会有什么变化吗git状态?

Git内部构件的可视指南-对象,分支以及如何从头开始创建存储库37

不, 🤔。

这是为什么?好吧, 知道我们的文件已经提交了, 吉特需要了解最新消息承诺。如何吉特去做?它去了头:

Git内部构件的可视指南-对象,分支以及如何从头开始创建存储库38

在Windows上查看" HEAD"

Git内部构件的可视指南-对象,分支以及如何从头开始创建存储库39

在UNIX上查看`HEAD`

头指着主但什么是主?我们还没有真正创建它。

正如我们在本文前面所解释的那样, 分支只是对a的命名引用。承诺。在这种情况下, 我们希望主引用承诺与哈希80e8ed4fb0bfc3e7ba88ec417ecf2f6e6324998f.

我们可以通过在以下位置简单地创建一个文件来实现\ refs \ heads \ master, 其中包含此哈希的内容, 如下所示:

Git内部构件的可视指南-对象,分支以及如何从头开始创建存储库40

⭐总之, 科只是里面的一个文件.git \ refs \ heads, 其中包含承诺它指的是。

现在, 终于, git状态和git日志似乎赞赏我们的努力:

Git内部构件的可视指南-对象,分支以及如何从头开始创建存储库41

我们已经成功创建了一个承诺不使用瓷器命令!多么酷啊? 🎉

就像我们创建了一个资料库和一个承诺不使用git初始化, git添加orgit提交, 现在我们将创建并在分行不使用瓷器命令(git分支orgit结帐)。

如果你很兴奋, 那完全可以理解, 我也是

开始吧:

到目前为止, 我们只有一个科, 命名主。用名称创建另一个测试(相当于git分支测试), 我们只需创建一个名为测试内.git \ refs \ heads, 并且该文件的内容将相同承诺的散列为主指着。

Git内部构件的可视指南-对象,分支以及如何从头开始创建存储库42

如果我们使用git日志, 我们可以看到确实如此-两者主和测试指向这个承诺:

Git内部构件的可视指南-对象,分支以及如何从头开始创建存储库43

我们还要切换到新创建的分支(相当于git checkout测试)。为此, 我们应该改变头指向我们的新分支:

Git内部构件的可视指南-对象,分支以及如何从头开始创建存储库44

通过更改" HEAD"切换到" test"分支

如我们所见, 两者git状态和git日志确认它头现在指向测试, 因此是活动分支。

现在, 我们可以使用已经用于创建另一个文件并将其添加到索引的命令:

Git内部构件的可视指南-对象,分支以及如何从头开始创建存储库45

使用上面的命令, 我们创建了一个名为test.txt, 内容为测验, 创建了一个对应的一滴并将其添加到编号。我们还创建了一个树代表编号.

现在该创建一个承诺引用这个树。这次, 我们还应该指定父母这个的承诺-这将是前一个承诺。我们使用-p开关git提交树:

Git内部构件的可视指南-对象,分支以及如何从头开始创建存储库46

我们刚刚创建了一个承诺, 带有树以及父母, 我们可以看到:

Git内部构件的可视指南-对象,分支以及如何从头开始创建存储库47

将git日志给我们看新承诺?

Git内部构件的可视指南-对象,分支以及如何从头开始创建存储库48

我们可以看到, git日志没有显示任何新内容。这是为什么? 🤔请记住git日志追踪分行查找要显示的相关提交。现在显示给我们测试和承诺它指向, 并且还显示主指向相同承诺.

是的-我们需要改变测试指向我们的新承诺。我们可以通过简单地更改.git \ refs \ heads \ test:

Git内部构件的可视指南-对象,分支以及如何从头开始创建存储库49

有效! 🎉🥂

git日志去头, 它告诉它去分支测试, 指向承诺 465 ... 5e, 链接回其父级承诺 80e ... 8f.

随时欣赏美丽, 我们吉特你。 😊

这篇文章向你介绍了吉特。我们从介绍基本对象开始-斑点, 树木和提交.

我们了解到斑点保存文件的内容。一种树是目录列表, 包含斑点和/或子树木。一种承诺是我们工作目录的快照, 其中包含一些元数据, 例如时间或提交消息。

然后我们讨论了分行并解释说, 它们不过是对一个承诺.

我们继续描述工作目录, 具有与其关联的存储库的目录, 暂存区(索引)持有树下一个承诺和资料库, 这是提交.

我们澄清了这些术语与吉特通过创建新的存储库并使用众所周知的文件提交文件, 我们知道的命令git初始化, git添加和git提交.

然后, 我们无所畏惧地深入到吉特。我们停止使用瓷器命令, 而改用管道命令。

通过使用回声和底层命令, 例如git哈希对象, 我们能够创建一个斑点, 将其添加到编号, 创建一个树的编号, 并创建一个承诺指向那个的对象树.

我们还能够创建和切换分行。你们自己尝试过的人都感到很荣幸!👏

希望在阅读了这篇文章之后, 你会感到自己加深了对与幕后工作的了解。吉特.

谢谢阅读!如果你喜欢这篇文章, 可以在swimm.io博客。

奥默·罗森鲍姆, 游泳的首席技术官。网络培训专家和Checkpoint安全学院的创始人。的作者计算机网络(希伯来语).

访问我的YouTube频道.


已经写了很多关于吉特。具体来说, 我发现这些参考很有用:

  • Git Internals YouTube播放列表-Brief简介
  • 蒂姆·伯格隆德(Tim Berglund)的演讲"从头开始"
  • 从下而上的Git — John Wiegley
  • 如承诺的那样, 文档:混淆的git
  • Git Internals — Git Objects —来自Pro Git书, 作者Scott Chacon和Ben Straub
一盏木

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: