Я хотел бы добавить к ответу Марка.
В то время как Subversion, CVS и даже Mercurial используют Delta Storage - при этом они сохраняют только разницу между коммитами, Git делает снимок дерева с каждым коммитом.
Когда содержимое файла изменяется, новый объект добавляется для содержимого в хранилище объектов. На данный момент Git заботится только о содержимом, а не о имени файла. Имя файла и путь отслеживаются через объекты дерева. Когда файл изменяется и добавляется в индекс, создаются BLOB-объекты для содержимого. Когда вы фиксируете (или используете низкоуровневые команды, такие как git write-tree), объект дерева обновляется, чтобы файл указывал на новое содержимое. Также следует отметить, что хотя каждое изменение в файле создает для него новый BLOB-объект, но файлы с одинаковым содержимым никогда не получат разные BLOB-объекты.
Итак, ваш вопрос
Если вы изменяете файл, то изменяет
версия файла получить свой собственный блоб
и для чего это свой собственный ша?
Новый контент получает новый BLOB-объект, а файл указывает на новый BLOB-объект. А также, если новый контент такой же, как у какого-то предыдущего блоба, он просто указывает на старый.
PS: Следует отметить, что Git "упаковывает" эти "незакрепленные объекты" в файлы упаковок (где git хранит дельты из одной версии файла в другую), когда вокруг слишком много незакрепленных объектов, если git gc
запускается вручную или при отправке на удаленный сервер, поэтому может быть так, что файлы хранятся в дельте. Посмотрите на главу Pro-Git об этом для получения дополнительной информации - http://progit.org/book/ch9-4.html