(点选下方社会公众号,可加速关注)
英语:Pierre de Wulf
原文:庞德公新浪网
镜像:http://blog.jobbole.com/98634/
“哇欧,我才读了 git 的加速进阶手册就觉得它实在酷毙了,现在采用起 git 来觉得超难受,爸爸非但不害怕就要I577甚么韦尔齐了。”—— 该位义士曾曰过
后辈刚采用 git 的这时候,就像去到两个既不识该地文本也不会说该地词汇的孤单的国家。只要你知道你在甚么地方、要去这儿,一切都 OK,而除非你误入,麻烦事就来了。
网路上已经有许多关于自学基本的 git 指示的该文,但责任编辑不属于这两类,而要试著圣埃蒂安德。
初学者常常被 git 吓到,实际上也极难不被吓到。能肯定的是 git 是很强悍的辅助工具但还不如亲善。大量的新概念,有些指示用文档做模块和不必文档做模块各别继续执行的姿势迥然不同,还有直白的答谢等…
我误以为消除第二道困境的方法就是更为重要是采用 git commit/push 就完了。假如他们花点时间去或者说了解究竟git是由甚么内部结构的,那Sonbhadra省却不少麻烦事。
探析 .git
那么他们开始吧。当你建立两个库房的这时候,采用 git init 命令, git Sonbhadra建立两个神奇的产品目录:.git。这个产品目录下包涵了所有 git 恒定工作所须要的重要信息。Jaunpur一点,假如你想从你的项目中删掉 git 但又要凡塘文档,只须要删掉 .git 文档夹就能了。但,你确认要辣么做?
这就是你第一次提交之前 .git 产品目录的样子:
这个他们稍后会讨论
这个文档包涵你库房的设置重要信息。例如这里会放你远程库房的 URL,你的 email 地址,你的用户名等…。 每次你在控制台采用“git config…”命令时,修改的就是这里。
gitweb(能说是 github 的前身)用来显示库房的描述。
这是两个有意思的特性。Git 提供了一系列的脚本,你能在 git 每两个有实质意义的阶段让它们自动运行。这些脚本就是 hooks,能在 commit/rebase/pull…. 的前后运行。脚本的名字表示它甚么这时候被运行。例如两个有用的预推送 hook 可能会测试关于保持远程库房一致性的式样原则。
你能把你不想让 git 处理的文档放到 .gitignore 文档里。那么,exclude 文档也有同样的作用,不同的地方是它不会被共享,比如当你不想跟踪你的自定义的 IDE 相关的配置文档时,即使通常情况下 .gitignore 就足够了(假如你用到了这个请在评论中告诉我)。
commit 的真相
每一次你建立两个文档并跟踪它会发现,git 会对其进行压缩然后以 git 自己的数据结构形式来存储。这个压缩的对象会有两个唯一的名字,即两个哈希值,这个值存放在 object 产品目录下。
在积极探索 object 产品目录前,他们先要问自己 commit 究竟是何方神圣。commit 大致能视为你工作产品目录的快照,但它又更为重要只是一种快照。
实际上,当你提交的这时候,为建立你工作产品目录的快照 git 只做了两件事:
假如这个文档没有改变,git 仅仅只把压缩文档的名字(就是哈希值)放入快照。
假如文档发生了变化,git 会压缩它,然后把压缩后的文档存入 object 产品目录。最后再把压缩文档的名字(哈希值)放入快照。
这里只是简单介绍,整个过程有一点复杂,以后的博客里会作说明的。
除非快照建立好,其本身也会被压缩并且以两个哈希值命名。那么所有的压缩对象都放在这儿呢?答案是object 产品目录。
这就是我建立两个空文档 file_1.txt 并提交后 object 产品目录看起来的样子。请注意假如你的文档的哈希值是“89faaee…”,git 会把这个文档存在 “89” 产品目录下然后命名这个文档为 “faaee…”。
你会看到3个哈希。两个对应 file_1.txt ,另两个对应在提交时所建立的快照。那么第三个是甚么呢?其实是因为 commit 本身也是两个对象并且也被压缩存放在 object 产品目录下。
现在,你须要记住的是两个 commit 包涵四个部分:
工作产品目录快照的哈希
提交的说明重要信息
提交者的重要信息
父提交的哈希值
假如他们解压缩两个提交,你自己能看看究竟是甚么:
这是我看到的
如你所见他们得到了所期望看到的的:快照的哈希,作者,提交重要信息。这里有两样东西很重要:
正如预料的一样,快照的哈希 “86550…” 也是两个对象并且能在object产品目录下找到。
因为这是我的第两个提交,所以没有父提交。
那我的快照里面究竟是些甚么呢?
到这里他们看到的最后两个对象是他们先前提到的唯一会存在于快照中的对象。它是两个 blob(二进制文档),这里就不作深究了。
分支,标签,HEAD 都是一家人
那么现在你知道 git 的每两个对象都有两个正确的哈希值。现在他们来看看 HEAD 吧!那么,在 HEAD 里又有甚么呢?
cat HEAD
ref: refs/heads/master
这看起来 HEAD 不是两个hash,倒是容易认知,因为 HEAD 能看作两个你目前所在分支的指针。假如他们看看 refs/heads/master,就会发现这些:
cat refs/heads/master
4cf44f1e3fe4fb7f8aa42138c324f63f5ac85828
是不是很熟悉?是的,这和他们第两个提交的哈希完全一样。由此表明分支和标签就是两个提交的指针。明白这一点你就能删掉所有你想删掉的分支和标签,而他们指向的提交依然在那里。只是有点难以被访问到。假如你想对这部分了解更多,请参考git book。
尾声
到目前为止你应该了解到, git 所做的事就是当你提交的这时候“压缩”当前的工作产品目录,同时将其和其他一些重要信息一并存入 objects 产品目录。但假如你足够了解 git 的话,你就能完全控制提交时哪些文档应该放进去而哪些不应该放。
我的意思是,两个提交并非或者说意义上是两个你当前工作产品目录的快照,而要两个你想提交的文档的快照。在提交之前 git 把你想提交的文档放在这儿? git 把他们放在 index 文档里。他们现在不会去深入探究 index,同时假如你确实好奇你能参考这里。
鸣谢
我希望通过责任编辑你更好的认知了 git 的核心概念。假如你有任何问题和评论,请毫不犹豫的告诉我,你也能在 twitter 上粉我。
【今日微信公号推荐↓】
更多推荐请看《值得关注的技术和设计社会公众号》
其中推荐了包括技术、设计、极客 和 IT相亲相关的热门社会公众号。技术涵盖:Python、Web前端、Java、安卓、iOS、PHP、C/C++、.NET、Linux、数据库、运维、大数据、算法、IT职场等。点选《值得关注的技术和设计社会公众号》,发现精彩!