Git 是两个强悍的辅助工具,但采用出来却并非很亲善。假如开发人员们能或者说花天数去认知 Git 的形成,Sonbhadra防止许多无谓的麻烦事。
译者 | Pierre de Wulf
翻译者 | 没错如月,白眉林 | 郭芮
下列为原文:
算数 Git 就像两个要学该地词汇的人走进两个孤单的北欧国家——假如你晓得他们在哪,该去这儿,那说实话。除非你误入了,那麻烦事就大了。
网路上有许多自学 Git 基本上指示的该文,但责任编辑并不归属于这两类该文。我在该处将试著提供更多两个相同的自学路子。
新手通常都很惧怕 Git,极难怕。众所周知,Git 是两个强悍的辅助工具,但采用出来却并非很亲善。采用 Git 要认知许多捷伊基本上概念,将文档做为指示模块和不做为模块二者的涵义大不相同。
我指出要想消除那些十分困难,不但要自学 Git 的 commit 和 push 的用语。假如他们能或者说花天数去认知 Git 的形成,Sonbhadra防止许多无谓的麻烦事。
科学研究 .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 都将把文档进行压缩并存储在他们的数据结构中。被压缩的对象将具有唯一的名称和 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
committer Pierre De Wulf <[[email protected]](mailto:[email protected])> 1455775173 -0500
commit A
正如预想的一样,他们看到了快照的哈希值、译者重要信息和提交的注释。
有两个非常重要的事项:
正如所预想的那样,快照的哈希 “86550…” 也是两个对象,你能在对象文档夹中找到它。
因为这是第一次提交,所以没有父提交的哈希值。
那么,在快照中存的是啥呢?
git cat-file -p 86550c31847e518e1927f95991c949fc14efc711
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 file_1.txt
他们找到之前存储的最后两个对象,也是他们快照中的唯一的两个对象。它是两个 blob 对象,这是另外的知识点,不在这里讨论。
分支, 标签, HEAD 都一样
cat HEAD
ref: refs/heads/master
HEAD 不是两个哈希,HEAD 能认知为指向你正在采用的分支的顶端的指针。他们接下来看下 refs/heads/master:
cat refs/heads/master
4cf44f1e3fe4fb7f8aa42138c324f63f5ac85828
看出来眼熟吗?这和他们第一次提交的哈希值相同。这表明分支 ( branch) 和标签 (tag) 只不过是两个指向提交的指针。这就意味着,即使你删掉了你要删掉的
写在最后
所以学到这里,你应该明白 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大趋势