Git 原理探秘
版本控制系统与 Git
Git 内部原理基础
Git 基本操作
Git 团队协同开发指令
还没push 前可以做的事
Git概念及工作原理总结
Git 内部原理详解
本文档使用 MrDoc 发布
-
+
首页
Git 内部原理基础
Git 可以说是一种用档案内容来定位的档案系统,SHA1 是根据内容产生的,跟档名无关。内容一样的档案,即使档案名称不同,在 *Repository* 里仍然只存一份。解耦合(decouple)了内容与当时的档名。 Git 的 Repository 又称作 Object Database 资料库,共有四种 Objects 类型: * Blob 记录档案内容 * Tree 记录该目录下有哪些档案(档名、内容的 SHA1)和 Trees * Commit 记录 commit 讯息、Root tree 和 Parent commits 的 SHA1 * Tag 记录标签 所谓的 *SHA-1* 是一种单向 Hash 杂凑加密演算法,例如它会将 `hello` 字串单向加密成为 `aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d`。这个演算法有以下特性: * 给定 message 容易计算出 hash * 极度困难从 hash 推回 message * 极度困难修改 message 而 hash 不变 * 极度困难不同的 messages 而 hash 一样 * hash 的分布很分散,跟 message 关联不大 ## 观察 Git 内部如何储存档案 ``` echo sweet > sweet.txt git add . find .git/objects -type f Git 內部儲存在 .git/objects/aa/823728ea7d592acc69b36875a482cdf3fd5c8d 這是 "blob" SP "6" NUL "sweet" LF 的 SHA1 printf "blob 6\000sweet\n" | shasum 或 echo 'sweet' | git hash-object -w --stdin git cat-file -p aa823728ea7d592acc69b36875a482cdf3fd5c8d ``` ## 观察 Git 内部如何储存 Commit ``` 隨便抓一個 Commit 的 SHA1 開始: git cat-file -p a08181bf3 (觀察這個 commit,找出 tree 位置 ) git cat-file -p ea44d629 (觀察這個 tree,找出任一個 blob SHA1) git cat-file -p d9647d8a (觀察這個 blob 的內容) ``` ## 参照 Reference * Reference 会指向一个 Commit * tag 不会移动,指向的 commit 都一样 * (带有额外资讯的 tag 内部会用 Object 储存) * branch 指向该 branch 最新的 commit * HEAD 指向 current branch Reference 是非常便宜的。开新 branch 和 tag 只不过是 refs 而已,直到真的有 commit 前都没有什么负担。不像有些 CSV 开分支会复制一份原始码,非常耗费资源。 ## 正直 * SHA1 是内容的 checksum * Integrity: 如果档案内容有损毁,就会发现跟 SHA1 不同。如果 tree 改档名,也会被发现。 * 这在分散式系统非常重要:资料从一个开发者传到另一个开发者时,确保资料没有被修改 ## 观察 Git 内部如何储存 Branch 分支 ``` cat .git/HEAD 拿到目前工作目錄 current branch 是指向哪一個 branch cat .git/refs/heads/master 拿到 master branch 指向的 commit cat .git/refs/tags/foobar 拿到 foobar tag 指向的 commit ``` 了解了 Git 如何储存 Branch 之后,就再也不会想用中央储存式的 SVN 了: * svn 开分支和 merge 超痛苦,能避免开 branch 就避免开 branch * svn 看 log 超痛苦,需要等待网路连线 * svn commit 或 checkout 超慢,主机如果放国外常 commit 一半中断
追风者
2022年3月3日 00:33
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
关于 MrDoc
觅思文档MrDoc
是
州的先生
开发并开源的在线文档系统,其适合作为个人和小型团队的云笔记、文档和知识库管理工具。
如果觅思文档给你或你的团队带来了帮助,欢迎对作者进行一些打赏捐助,这将有力支持作者持续投入精力更新和维护觅思文档,感谢你的捐助!
>>>捐助鸣谢列表
微信
支付宝
QQ
PayPal
Markdown文件
分享
链接
类型
密码
更新密码