git是如何检测文件变化的?-灵析社区

一颗西兰花

初始化时,对象库中为空 ![图片](https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241016/ba31ae0102a47c7339694dacb5bb24e5.png) 创建一个 t1.txt 文件,在第一行输入 123456进行 git add操作后在 46 目录下发现新增的 blob 对象,所谓的 SHA 算法也就是 Git 对象中的对象 ID,拆分成“2 位文件目录名+38 位对象名”用于快速查找 Git 中的文件 ![图片](https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241016/47282ba5615842925645219060203729.png) ![图片](https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241016/b780a78c38bb27150b754808418552c8.png) 查看 t1.txt 在 Index 树下如何存储,在 Git 中可以看到其内容:git write-tree是使用当前索引 Index 创建树对象,同时会创建一个树目录,也就是 aa,我们可以忽略它 ![图片](https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241016/c245a426bdeb440042f82d74dfb61972.png) 如果将 t1.txt 文件内容修改,增加一行 123456 并操作 git add,查看当前对象库: ![图片](https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241016/9d91beb107c319ff4db12834a721051c.png) 发现创建了一个新的目录,再查看其内部文件: ![图片](https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241016/1a4f3edb62dec27236562965452dcf66.png) 实际上 t1.txt 的内容修改,Git 会再创建一个新 blob 对象存放整个内容,而不是在原 blob 对象下增量存储 ![图片](https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241016/35fa39222fb22de3261bd73b64dae09f.png) 修改 t1.txt 为 t2.txt,再次 git add,新增了 8c 目录和里面的文件实际上 Git 并没有在对象库中删除之前的 t1.txt,创建了一个新对象,新对象里面的内容指向原来的 t1.txt: ![图片](https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241016/1d7d6772b24252e55f2d3bf7cc108514.png) 最后再将 t2.txt 修改为 t1.txt 并操作 git add 查看 Index 文件修改时间,我们得知 Index 树变化了,但是其他文件目录没有发生变化: ![图片](https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241016/58f8c4a5d557993febc917163f268860.png) 查看当前的 Index 索引树,发现最后结果还是指向了和上面相同的那个 t1.txt 文件: ![图片](https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20241016/fb3f614c27b2be2b8d9ae6322e7ca981.png)

阅读量:1

点赞量:0

问AI