Разве разные версии файла получают свой собственный blob/sha?

Если я правильно прочитал, git хранит все его файлы в блоках. Если вы изменяете файл, измененная версия файла получает его собственный blob, и поэтому он имеет собственный ша?

Ответ 1

Правильно - если содержимое файла изменяется даже на один бит, оно будет иметь новое имя объекта (a.k.a. SHA1sum или хеш). Вы можете увидеть имя объекта, которое будет иметь файл с git hash-object, если вы хотите проверить, что:

 $ git hash-object text.txt
 9dbcaae0abd0d45c30bbb1a77410fb31aedda806

Вы можете узнать больше о том, как здесь вычисляются хеши для blobs:

Ответ 2

Я хочу добавить к ответу Mark.

В то время как Subversion, CVS и даже Mercurial используют Delta Storage - при этом они сохраняют разницу между коммитами, Git принимает моментальный снимок дерева с каждой фиксацией.

При изменении содержимого файла для содержимого в хранилище объектов добавляется новый блок. Git заботится только о содержании на данный момент, а не о имени файла. Имя файла и путь отслеживаются через древовидные объекты. Когда файл изменяется и добавляется в индекс, создаются капли для содержимого. Когда вы совершаете (или используете команды нижнего уровня, такие как Git write-tree), объект дерева обновляется, чтобы файл указывал на новый контент. Следует также отметить, что, хотя каждое изменение файла создает для него новый blob, но файлы с одним контентом никогда не получат разные капли.

Итак, ваш вопрос

Если вы измените файл, измените его версия файла получает его собственный blob и для чего она собственная ша?

Новый контент получает новый blob, и файл указывает на новый blob. А также, если новый контент такой же, как и предыдущий blob, он просто указывает на старый.

PS: Следует отметить, что Git "упаковывает" эти "свободные объекты" в файлы пакетов (где Git хранит дельта из одной версии файла в другую), когда слишком много свободных объектов вокруг, если git gc запускается вручную или при нажатии на удаленный сервер, так что это может быть случай, когда файлы хранятся в delta. Посмотрите на главу Pro- Git по этому поводу для получения дополнительной информации - http://progit.org/book/ch9-4.html