gpt4 book ai didi

git:为什么声明 "git is based on differences between files"是错误的?

转载 作者:行者123 更新时间:2023-12-05 08:27:39 27 4
gpt4 key购买 nike

我知道 git add 只保存特定文件的新快照。但是我对“快照”这个词有点困惑。据我了解 git(例如 by thatthat)来源,快照实际上只是与上次提交的差异。

引自 2 :

it basically takes a picture of what all your files look like at that moment and stores a reference to that snapshot. To be efficient, if files have not changed, Git doesn’t store the file again, just a link to the previous identical file it has already stored.

在我看来,这完全像是基于文件差异的系统描述-.-

编辑:

更具体一点:

我明白,如果一个 blob 没有被修改,哈希值就不会改变,因此会在进一步的提交中使用。这对我来说也很有意义,git 可以检测 blob 之间的相似性,从而消除冗余。

=> 如果我调用例如vimdiff(只是为了说明这个概念)到一个 blob 并将输出保存在一个新的 blob 中?

=>更改后的 blob 与其他 blob 有什么共同之处?

最佳答案

简答:不,Git 总是记录整个文件。

更长的答案:好吧,这不完全正确。 逻辑上,Git 总是记录整个文件。然而,在存储后端,Git 对来自所有修订所有文件 执行增量压缩,因此它甚至可以检测到不同 文件之间和跨文件之间的相同内容所有 分支的完整 历史,而不仅仅是父提交。由于网络协议(protocol)和存储后端共享相同的格式(“打包文件”),您可以在 pushfetch 方面获得相同的效率。

但是,请务必记住,这是存储后端的内部实现细节。它不是对象模型的一部分。对象模型是每次提交都包含整个树。

这是 Git 的对象模型:

  • blob:字节流。基本上,一个文件,但只有它的内容。它没有名字。通过这种方式,Git 就像 Unix 文件系统一样工作,文件没有名称,而是目录将名称与文件相关联。

  • :(mode, name, {tree|blob}) 三元组的平面(!!!)列表。这相当于一个 Unix 目录。它将名称和模式(主要是可执行或不可执行)与 blob 或树相关联。 IE。树可以递归。

  • commit:指向树的指针和指向零个、一个或多个父提交的指针。还包含日期戳和两个名称字符串(作者和提交者)以及最重要的提交消息。

  • (本地标签):从技术上讲,不是 Git 对象。只是一个指向提交的本地文件。

  • 注释标记:包含指向提交的指针、名称和注释消息。

  • signed tag:包含一个带注释的标签(???)和一个数字签名[不确定这个,是建立在带注释的标签之上还是重复它? ]

  • note:可以附加到任何 Git 对象的一段文本。这可用于将任意用户定义的元数据添加到任何 Git 对象,例如CI 服务器可以将代码覆盖率结果附加到提交,或者错误跟踪器可以将链接附加到修复错误的提交票证,Web 服务器可以将 MIME 类型附加到 blob,发布管理系统可以将通过/不通过投票附加到注释标签,……

请注意,只有 blob 实际上包含文件数据。其余的只是指针。并且 blob 没有名称,这意味着只要一个 blob 具有相同的内容,它就是同一个 blob,因此在对象存储中只存在一次。事实上,它甚至在整个 Git 宇宙中只存在一次!例如,FSF 的 GPL COPYING 文件,只要你不修改它,即使在完全不相关的存储库中,它也将是完全相同的 blob!

关于git:为什么声明 "git is based on differences between files"是错误的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33455666/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com