我明白,如果你在git中选择一个提交,它会创建一个新的提交副本(使用新的SHA等)。
但在内部,如果有一个大的二进制文件,数据是否重复,导致repo膨胀?或者它是否足够聪明才能理解它是同一个blob?
Git非常聪明,可以继续使用相同的对象,并在您创建的提交中引用它。 (虽然我有点理解您对重复副本的担忧,因为提交本身不仅仅是重复而是重新创建。)
当文件实际发生变化时,您将创建一个新对象,从而增加了回购。
从用户的角度来看,将提交视为“包含”文件是很自然的,但在内部,提交“引用”文件更准确。
在它的基础上,git是一个内容索引的对象存储:有一堆对象,所有对象都由它们的SHA1哈希唯一标识。在该商店的顶部,给出对象意味着代表版本控制系统的组件。
有a good introduction to this on the Git website。
因此,当您提交文件时,会存储多个对象:
您通常看到的SHA1是此提交对象的SHA1 - 知道git足以找到完整的提交信息,并从那里找到目录列表,并从那里找到文件内容。
当你挑选提交时,git将需要创建:
从某种意义上说,git在这里并不“聪明” - 它不关心为什么一个对象可能被复制,它只是为每个SHA1哈希存储一个对象,如果它发现一个对象已经存在该哈希,假设它们是同一件事情。多个(可能不相关)提交引用相同文件内容的能力只是作为此存储系统的方便副作用而失败。