Я не уверен, что другие ответы действительно полностью ответили на ваш вопрос.
Git хранит коммиты и фактическое содержимое файла отдельно. Коммит не содержит файлов - он содержит ссылки на хешей файлов, содержащихся в коммите. Файлы хранятся отдельно от коммитов, и если два коммита имеют одинаковую версию файла, оба этих коммита будут ссылаться на один и тот же хеш , но сам файл не дублируется. Если файл изменяется между фиксациями, файл сохраняется дважды, каждая версия файла имеет свой собственный хэш, и фиксации будут ссылаться на разные хеши.
Допустим, вы начинаете с одного коммита, который содержит два файла, a.txt и b.txt, каждый из которых хэширует свое значение:
Commit 1:
Filename | Hash
---------------------
a.txt | abcdef111111
b.txt | ghijkl222222
Обратите внимание, что коммит не содержит содержимого файла. Git хранит содержимое файлов и хэшей в другом месте.
File store:
Hash | File contents
---------------------------------
abcdef111111 | hello world
ghijkl222222 | int main()
Допустим, вы обновили a.txt и сделали новый коммит. Во-первых, Git сохраняет новую версию файла в своем хранилище содержимого файла:
File store:
Hash | File contents
---------------------------------
abcdef111111 | hello world
ghijkl222222 | int main()
zyxwvu999999 | goodbye world <-- new entry
И новый коммит указывает на этот хеш как содержащий содержимое a.txt:
Commit 2:
Filename | Hash
---------------------
a.txt | zyxwvu999999
b.txt | ghijkl222222
Поскольку b.txt не изменился, его не нужно было снова хранить. Второй коммит просто ссылается на тот же хеш, что и первый коммит.