通过 .git 目录深入理解 Git

2023-08-23 0 609

Git 是两个强悍的辅助工具,但采用出来却并非很亲善。假如开发人员们能或者说花天数去认知 Git 的形成,Sonbhadra防止许多无谓的麻烦事。

通过 .git 目录深入理解 Git

译者 | Pierre de Wulf

翻译者 | 没错如月,白眉林 | 郭芮

下列为原文:

算数 Git 就像两个要学该地词汇的人走进两个孤单的北欧国家——假如你晓得他们在哪,该去这儿,那说实话。除非你误入了,那麻烦事就大了。

网路上有许多自学 Git 基本上指示的该文,但责任编辑并不归属于这两类该文。我在该处将试著提供更多两个相同的自学路子。

新手通常都很惧怕 Git,极难怕。众所周知,Git 是两个强悍的辅助工具,但采用出来却并非很亲善。采用 Git 要认知许多捷伊基本上概念,将文档做为指示模块和不做为模块二者的涵义大不相同。

我指出要想消除那些十分困难,不但要自学 Git 的 commit 和 push 的用语。假如他们能或者说花天数去认知 Git 的形成,Sonbhadra防止许多无谓的麻烦事。

通过 .git 目录深入理解 Git

科学研究 .git 产品目录

好的,他们那时已经开始吧。

当你透过 git init建立 git 库房时, git 就会建立 .git 产品目录。该产品目录包涵让 git 能恒定组织工作所需的大部份重要信息。隐晦点说,假如你不该在工程项目中竭尽全力采用 git ,间接将 .git 产品目录删掉只凡塘文档方可。但为何这种做就能呢?

上面是你第一次提交后 .git 文档夹的样子:

├── HEAD

├── branches

├── config

├── description

├── hooks

│ ├── pre-commit.sample

│ ├── pre-push.sample

│ └── …

├── info

│ └── exclude

├── objects

│ ├── info

│ └── pack

└── refs

├── heads

└── tags

HEAD

后面再讲。

config (配置)

该文档包涵你的库房配置,比如远程的 url ,你的邮箱和用户名等。每次你在控制台采用git config…都会对这里产生影响。

description(描述)

供 gitweb ( github 的一种前身) 采用,显示库房的描述。

hooks (钩子)

这是两个有趣的特性。 Git 提供更多了一套脚本,能在每个有意义的 Git 阶段自动运行。那些被称为钩子的脚本能在提交 (commit)、变基 (rebase)、拉取 ( pull ) 操作的前后运行。脚本命预示着它的执行时机。如他们能编写 pre-push 的做为钩子,进行推送代码前的检查。

info (重要信息)

你能将不该被 git 管理的文档记录到 .gitignore 文档中。排除文档的意思是不该共享这个文档。例如你不该共享你的 IDE 自定义配置,将其添加到 .gitignore 文档中方可。

通过 .git 目录深入理解 Git

一次提交包涵哪些内容?

每次你建立两个文档,并追踪它,git 都将把文档进行压缩并存储在他们的数据结构中。被压缩的对象将具有唯一的名称和 hash 值,并将存储到对象 (object) 产品目录中。

在科学研究对象产品目录之前,他们必须明白一次提交的涵义是什么。你可能会说,一次提交就是当前组织工作产品目录的两个快照,但事实远不止如此。

实际上,当你提交时,git 透过上面两个步骤对你的组织工作产品目录建立快照:

假如文档没啥变化,git 只是将压缩的文档(哈希值)添加到快照中。

假如文档发生了变化, git 将对其进行压缩并将其存储在 object 文档夹。最终,将这个压缩文档的名称(哈希值)添加到快照中。

这里给出两个简化的过程,实际上整个过程有点复杂,将在以后的该文中给出详细的介绍。

除非快照被建立出来,它Sonbhadra被压缩,以哈希值命名。那么那些压缩的对象存在这儿呢?他们被存在 object 文档夹中。

├── 4c

│ └── f44f1e3fe4fb7f8aa42138c324f63f5ac85828 // hash

├── 86

│ └── 550c31847e518e1927f95991c949fc14efc711 // hash

├── e6

│ └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391 // hash

├── info // lets ignore that

└── pack // lets ignore that too

这是我建立了两个空的文档 1.txt 并提交后 object 文档夹的样子。请注意,假如你的文档哈希值为 “4cf44f1e…”,git 会将其存储到 “4c”子产品目录中,并将其命名为”f44f1…”。这个小技巧,将 /objects产品目录的数量减少到 255 个以内。

你要记住的是,一次提交包涵 4 个部分:

组织工作产品目录快照名称(两个哈希值)。

一条评论/注释。

提交者重要信息。

父提交的哈希值。

假如他们解压提交的文档:

// 透过查看提交历史,你能轻松地查询到提交的哈希值

// 你都不需要复制完整的哈希值字符串,

// 复制能保证哈希值的唯一性的前面一段方可。

git cat-file -p 4cf44f1e3fe4fb7f8aa42138c324f63f5ac85828

得到上面的内容:

tree 86550c31847e518e1927f95991c949fc14efc711

author Pierre De Wulf 1455775173 -0500

committer Pierre De Wulf <[test@gmail.com](mailto:pierredewulf31@gmail.com)> 1455775173 -0500

commit A

正如预想的一样,他们看到了快照的哈希值、译者重要信息和提交的注释。

有两个非常重要的事项:

正如所预想的那样,快照的哈希 “86550…” 也是两个对象,你能在对象文档夹中找到它。

因为这是第一次提交,所以没有父提交的哈希值。

那么,在快照中存的是啥呢?

git cat-file -p 86550c31847e518e1927f95991c949fc14efc711

100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 file_1.txt

他们找到之前存储的最后两个对象,也是他们快照中的唯一的两个对象。它是两个 blob 对象,这是另外的知识点,不在这里讨论。

通过 .git 目录深入理解 Git

分支, 标签, HEAD 都一样

cat HEAD

ref: refs/heads/master

HEAD 不是两个哈希,HEAD 能认知为指向你正在采用的分支的顶端的指针。他们接下来看下 refs/heads/master:

cat refs/heads/master

4cf44f1e3fe4fb7f8aa42138c324f63f5ac85828

看出来眼熟吗?这和他们第一次提交的哈希值相同。这表明分支 ( branch) 和标签 (tag) 只不过是两个指向提交的指针。这就意味着,即使你删掉了你要删掉的

通过 .git 目录深入理解 Git

写在最后

所以学到这里,你应该明白 git 提交就是把你当前工作产品目录的文档“压缩”,然后将其和其他重要信息一起存储到对象文档夹中。假如你对 git 足够熟悉,你就会晓得哪些文档会包涵在提交中,哪些文档不会被提交。

我这里说的提交,并并非指你的组织工作产品目录快照,而是指你要提交的文档快照。在实际执行之前,git 会在这儿存储你要提交的文档?它将他们存储到索引文档中。不过,他们暂时不打算深入细致科学研究它。假如你真的感兴趣,能透过这里(

https://github.com/git/git/blob/master/Documentation/technical/index-format.txt)深入细致自学。

感谢阅读!希望透过阅读责任编辑,你能学到有价值的内容。希望责任编辑能帮你更轻松地采用 git。

原文:

https://www.daolf.com/posts/git-series-part-1/

翻译者:没错如月,知名互联网公司 Java 高级开发工程师,CSDN 博客专家。

责任编辑为

☞钉钉跃居 App Store 榜首背后,全民云办公时代来临?

☞远程办公 4 大坑,坑坑“致命”!

☞连登GitHub TOP榜,中国开发者在行动!

☞揭秘阿里、腾讯、字节跳动在家办公的区别

☞深度好文!新浪微博架构师详析微博云原生技术的思考与实践

☞2020年区块链和分布式账本技术的5大趋势

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务