| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 开发工具 -> 图解git原理 -> 正文阅读 |
|
[开发工具]图解git原理 |
用了这么久git,你有没有想过git的原理是什么?为什么git做回退这么快?创建、切换分支也这么快?git的工作区、暂存区、本地仓库、远程仓库都分别对应怎样的实体?打开一个git仓,看看目录下的.git文件夹,所有秘密都藏在这个.git里面。 下面举个栗子说明。我先git init了一个空仓,然后创建了两个txt文件,目录结构如下: --dir1 ? ?└ a.txt? 内容是"hello" --dir2 ? ?└ b.txt 内容是"world" 然后再git add;此时发生了如下几件事:
其中b6fc4c、04fea0这两串数字分别是a.txt和b.txt的SHA1值。 我们去.git/objects里找到这个b6fc4c,打开看看: ? ?是串乱码。因为是被压缩过的。我们可以用git cat-file -t [sha1]来查看它的类型,用git cat-file -p [sha1]来查看它被压缩之前的原始内容: 现在我们执行git commit做一次提交。此时发生了如下几件事:
我们从上往下看。先打开.git/HEAD文件(HEAD用来表示当前分支): 当前分支叫refs/heads/master。 我们再打开.git/refs/heads/master: 意思是master分支当前指向37de56这个提交。 那再用git?cat-file来看看这个提交的内容: 这个提交指向tree 83c4ae,继续往下看: tree 83c4ae记录了根目录的结构,它有两个子目录,dir1和dir2,分别对应tree 658293和tree 098076: 这两个tree又分别指向一个blob object。 此时来张图就一目了然了: 上图第1列(绿色)是第一次提交, 修改a.txt的内容,做第二次提交(蓝色),可以看到更新后的a.txt产生了一个新的blob 620ffd,而b.txt我没做修改,所以复用上次的blob 04fea0;并且a.txt的更新影响了其父目录dir1和其祖父目录(即根目录)的tree object的刷新。 将b.txt从dir2移动到dir1,做第三次提交(橙色),由于只是移动,所以没有新的blob产生,但由于我更新了目录结构,所以dir1目录以及根目录需要重新生成tree object。 综上:git使用.git中的各式各样的文件、以及文件之间的指向关系来管理整个仓库。 需要注意的几点:
参考资料:这才是真正的Git——Git内部原理揭秘! - 知乎 (zhihu.com) ? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/28 3:05:50- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |