深入了解Git

2022-12-21 0 308

Git外部怎样组织机构工作以组织机构统计数据和发展史纪录

绝大多数合作开发者都熟识管理工作工具系统,而在绝大多数情况下git事实上是优先选择。 责任编辑事实上是如是说git的组织机构工作基本原理,这将使合作开发者能更快地认知git。

Git是分布式系统版控制,用作储存文档和产品目录更动的发展史纪录,以期合作开发者能横越天数如是说大部份更动的出现形式。 起初,git是由Linux建立人建立的,用作在有数个开放源码合作开发者时管理工作LinuxMach合作开发。

在Linux手四幅(man git)中,Git被标记为”可笑的文本lenses”。 透过责任编辑,您能确认为何要这种初始化git。

Git的”Porcelain”和”Plumbing”指示

合作开发者组织机构工作业务流程中采用的绝大多数指示被称作”Porcelain白瓷指示”。 但那些指示是透过称作”管线指示”的合情理指示内部结构的。 让他们举个范例:

· Porcelain指示→git add,git commit,git push,git pull,git branch,git checkout,git tag,git merge,git rebase等…

· Plumbing指示→git cat-file,git has-object,git count-objects

如是说基元和SHA-1

即便他们都熟识基元,也须要归纳呵呵就可以使责任编辑完备。 透过身份验证表达式为这类输出聚合基元值。 Git采用SHA-1演算法。

那个单纯的表达式回到基元值,以git排序。 它在stdin输出上继续执行git hash-object。

echo aaa | git hash-object —

stdin→ 72943a16fb2c8f38f9dde202b7a70ccc19c52f34

反之亦然,基元值主要包括:

“aaa” → 72943a16fb2c8f38f9dde202b7a70ccc19c52f34

“aab” → 6f27bcf7c99320f97e935dac870033e697bc5b11

“bbb” → f761ec192d9f0dca3329044b96ebdb12839dbff6

· 基元值始终从任何输出聚合40位十六进制数

· 相同的输出将始终聚合相同的基元值

· 输出的微小差异将完全改变基元值

· 无法从基元值识别输出,并且基元表达式不可逆

· 基元值不是无限的,因为它限制为40位数字。 但两个输出产生相同基元的概率几乎为零,从而使基元成为唯一的基元。

Git产品目录

让他们采用git init初始化空的git仓库,您将看到在该位置建立了.git的隐藏产品目录。 让他们检查.git /:

branches/

config

description

HEAD

hooks/

info/

objects/

refs/

因为那些外部产品目录是刚刚启动的,所以绝大多数外部产品目录(例如branchs或objects /)将为空。 该.git将具有与git相关的文档,产品目录和其他信息的大部份详细信息,稍后将进行讨论。

Git对象统计数据库

让他们检查呵呵基元值怎样储存在.git中的git统计数据库中。 要将其写入git统计数据库,他们能采用更早的指示来排序基元,但要采用-w。

echo aaa | git hash-object –stdin -w

在这里,预期aaa以某种形式储存在git对象统计数据库中。

Git对象统计数据库事实上是持久化的键-值映射。 因此,对于任何元素,文本的基元值将是关键,而值将是文本。

这里

72943a16fb2c8f38f9dde202b7a70ccc19c52f34将是键,值将是aaa。 在编写此元素时,请检查将其放置在.git / objects中。 在基元表72中将有一个包含前两个元素的产品目录,其中包含一个具有其余基元值的文档:

943a16fb2c8f38f9dde202b7a70ccc19c52f34。

user@ubuntu:~/git-internals/.git/objects/72$

ls 943a16fb2c8f38f9dde202b7a70ccc19c52f34

该文档的文本已身份验证,无法直接读取。 因此,有一个表达式可用作从回到aaa的git统计数据库读取值。

git cat-file 72943a16fb2c8f38f9dde202b7a70ccc19c52f34 -p

这显示了怎样从git objects统计数据库中写入和读取统计数据,以及怎样将其组织机构为键-值映射,以及怎样将其除以基元convert提高性能。

Git对象

Git跟踪大部份文本,并作为对象储存在git统计数据库中。 类型主要包括:

· Blob→将文档文本储存为原始二进制统计数据。

· Tree 树→已储存产品目录文本。

· Submit 提交→提交储存的内容。

· Tag 带注释的标签→已储存标签文本。

那些文本中的任何一个都能用作排序基元值,并且文本将储存在对象统计数据库中的基元值中。 Git不会区分那些类型,而是将大部份类型均等地储存在.git / objects中。 最好透过示例学习那些类型。

用作提交,文档和产品目录的Git对象

为了清楚地如是说Git对象及其统计数据库,让他们建立一个文档并提交到git仓库中。

$ echo “aaa” >> a.txt

$ git add a.txt

$ git commit -m “Add a file”

透过git log标记最后一次提交的基元值,然后从对象统计数据库中读取该值:git cat-file 239d1a0 -p。 (在绝大多数项目中,可采用7位数字标记git对象,称作短SHA)

tree 37057b2e8a9041ef88b805a5b7c4e0e668a03be4

author Thomas Shelby <[email protected]> 1588048341 +0530

committer Thomas Shelby <[email protected]> 1588048341 +0530

Add a file

用作提交的git对象包含作者,天数,消息和树。 这里的树值似乎是另一个基元值,它表示提交时项目的状态。 让他们检查tree→git cat文档37057b2 -p的git对象。

100644 blob 72943a16fb2c8f38f9dde202b7a70ccc19c52f34 a.txt

这是指项目在基本产品目录中只有一个名为a.txt的blob(不是产品目录的文档)。 因此,能从基元值读取此文档的文本。

aaa

这将回到预期的a.txt文本。 在这里,透过commit他们能透过从tree和blob对象导航来内部结构产品目录的全部文本。 因此,应该看到,从.git产品目录开始,大部份信息都作为git对象从提交中构建组织机构工作目录。

在此初始提交之后,让他们检查git对象统计数据库:tree .git / objects

.git/objects/ ├── 23 └── 9d1a0f75b596d7d67e23721f11066abf144982 ├── 37 └── 057b2e8a9041ef88b805a5b7c4e0e668a03be4 ├── 72 └── 943a16fb2c8f38f9dde202b7a70ccc19c52f34 ├── info └── pack

这具有引用提交,树和Blob git对象的大部份3个对象。 git count-objects也能用来标记git对象的数量。

添加顺序提交和嵌套产品目录/文档

它只有一个文档,没有产品目录。 让他们添加更多的Blob和树,以清楚地如是说文档和产品目录在对象统计数据库中的储存形式。

$ mkdir files

$ echo “aaa” >> files/aaa.txt

$ echo “bbb” >> files/bbb.txt

$ git add .

$ git commit -m “Add files”

$ git log

故意为新文档添加了aaa文本。 让他们透过读取git对象→git cat文档5c45ebb -p来检查提交文本。

tree 21e6981939eae6277ad2128753e2984b552868cf

parent 239d1a0f75b596d7d67e23721f11066abf144982

重要的更动主要包括引用父提交的父属性。 然后观察由于文档和产品目录更动而树已更动。 让他们一步一步检查树和斑点的文本以构建文档和产品目录。

100644 blob 72943a16fb2c8f38f9dde202b7a70ccc19c52f34 a.txt

040000 tree 75d27669a0c4e9dd702c71c6ac3307d533493ba5 files

a.txt的Git对象与文本保持相同。 但在父树对象中,存在另一棵树,该树表示其产品目录。 检查此嵌套树的文本时:git cat-file 75d2766 -p

100644 blob 72943a16fb2c8f38f9dde202b7a70ccc19c52f34 aaa.txt

100644 blob f761ec192d9f0dca3329044b96ebdb12839dbff6 bbb.txt

如果选中斑点,它将具有预期的内容。 请注意,这里的aaa.txt将具有与a.txt相同的对象,因为文档文本包含aaa。 但,文档名更动并没有影响,因为它不是储存在blob本身中,而是储存在其包含的树中。

深入了解Git

> Git Object Model

能看出git怎样在两次提交之间重用包含aaa的公共blob。 只有7个对象

.git/objects/

├── 21

│ └── e6981939eae6277ad2128753e2984b552868cf

├── 23

│ └── 9d1a0f75b596d7d67e23721f11066abf144982

├── 37

│ └── 057b2e8a9041ef88b805a5b7c4e0e668a03be4

├── 5c

│ └── 45ebb2052428ce037e2fbf760cb0ec9a18f6e2

├── 72

│ └── 943a16fb2c8f38f9dde202b7a70ccc19c52f34

├── 75

│ └── d27669a0c4e9dd702c71c6ac3307d533493ba5

├── f7

│ └── 61ec192d9f0dca3329044b96ebdb12839dbff6

从提交解释组织机构工作产品目录

当前有两个提交,用户能检出这两个提交中的一个。 对于任何提交,其对文档和产品目录的观点可能有所不同。 对于提交,它将忽略连接的提交,并采用与其连接的树和Blob建立文档和目录。此处将显示两次提交的形式

深入了解Git

编辑现有文档

先前的提交能够显示怎样表示新添加的产品目录或文档。 在此提交中,它将显示文档编辑怎样反映在git对象模型中:将根产品目录文本中的a.txt编辑为aab。

深入了解Git

归纳呵呵git对象,那些单纯地引用如下:

· 树→表示产品目录。 包含包含树/斑点的文档结构

· Blob→表示文档。 包含身份验证的文档文本。

· 提交→表示提交。 包含作者和被引用的父树

· 标签→表示带注释的标签。 包含引用的提交。

git分支

默认情况下,git建立默认的master分支。 因此,此引用将采用.git储存在某个位置。 它事实上储存在.git / refs / heads / master中,而不是身份验证文档,因此能读为cat .git / refs / heads / master。 这仅包含最后一次提交的基元值。 因此,git分支只是对git commit hash值的引用。

让他们尝试添加分支并提交以检查引用的保留形式。

$ git checkout -b branch1 # create branch and switch to it$ cat .git/refs/heads/branch1 # refers to same commit as master$ nano a.txt # edit content of a.txt$ echo “ccc” >> c.txt # add new file of c.txt$ git add .$ git commit -m “branch1”

深入了解Git

验证branch1引用已修改,并且现在正在引用新的提交。 当前分支储存在更少的.git / HEAD中,作为refs / heads / branch1。

让他们采用git checkout master签出回master分支,请注意,这将更动HEAD文档中的当前分支以及根据该提交内部结构文档和产品目录。 因此,请注意,删除了在新提交中添加的c.txt。

$ git checkout master # create branch and switch to it

$ nano a.txt # edit content of a.txt

$ git add .

$ git commit -m “master”

深入了解Git

由于已经将其切换为master作为当前分支,因此不必在每次提交时都更新HEAD。 但在每次提交时,对提交的master分支引用都会更新为新的提交。

用分支包起来:

· 分支→是提交的参考

· HEAD→是对分支的引用。 (如果将头部检出到提交的头部分离,则能直接引用该提交。git checkout commit_id)

Git垃圾收集器

如图所示,git分支仅引用提交ID,因此能更动git文档以进行提交而无需任何引用。 (注意:这是出于演示目的而进行的修改。)

cat .git/refs/heads/master > .git/refs/heads/branch1

这用主提交引用替换了branch1提交引用。

深入了解Git

这里两个分支在3aefd7b中引用相同的提交,而在533503b中的提交未被分支,另一个提交或标记引用。

一段天数后,那些没有任何参考的git对象将被垃圾收集并删除。

正如”可笑的文本lenses”所建议的定义一样,能看出git在项目的每个天数框架都跟踪文档和产品目录。 它具有在给定天数内完全构建组织机构工作产品目录的能力。 因此能说git跟踪文本。

这是git怎样在后台为最终用户管理工作高级指示的简要如是说。 这旨在阐明git怎样管理工作文档,提交和分支。 正确认知git的组织机构工作基本原理也将有助于掌握高级git概念。

(责任编辑翻译自Udara Bibile的文章《Understanding Git under the hood》,参考:

https://medium.com/swlh/understanding-git-under-the-hood-b1aeae1d02f5)

相关文章

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

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