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 Object Model
能看出git怎样在两次提交之间重用包含aaa的公共blob。 只有7个对象
.git/objects/
├── 21
│ └── e6981939eae6277ad2128753e2984b552868cf
├── 23
│ └── 9d1a0f75b596d7d67e23721f11066abf144982
├── 37
│ └── 057b2e8a9041ef88b805a5b7c4e0e668a03be4
├── 5c
│ └── 45ebb2052428ce037e2fbf760cb0ec9a18f6e2
├── 72
│ └── 943a16fb2c8f38f9dde202b7a70ccc19c52f34
├── 75
│ └── d27669a0c4e9dd702c71c6ac3307d533493ba5
├── f7
│ └── 61ec192d9f0dca3329044b96ebdb12839dbff6从提交解释组织机构工作产品目录
当前有两个提交,用户能检出这两个提交中的一个。 对于任何提交,其对文档和产品目录的观点可能有所不同。 对于提交,它将忽略连接的提交,并采用与其连接的树和Blob建立文档和目录。此处将显示两次提交的形式
编辑现有文档
先前的提交能够显示怎样表示新添加的产品目录或文档。 在此提交中,它将显示文档编辑怎样反映在git对象模型中:将根产品目录文本中的a.txt编辑为aab。
归纳呵呵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”
验证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”
由于已经将其切换为master作为当前分支,因此不必在每次提交时都更新HEAD。 但在每次提交时,对提交的master分支引用都会更新为新的提交。
用分支包起来:
· 分支→是提交的参考
· HEAD→是对分支的引用。 (如果将头部检出到提交的头部分离,则能直接引用该提交。git checkout commit_id)
Git垃圾收集器
如图所示,git分支仅引用提交ID,因此能更动git文档以进行提交而无需任何引用。 (注意:这是出于演示目的而进行的修改。)
cat .git/refs/heads/master > .git/refs/heads/branch1
这用主提交引用替换了branch1提交引用。
这里两个分支在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)