Ответ
Git хранит коммиты как неизменяемые объекты в своей внутренней базе данных, расположенной в директории .git/objects. Git является контентно-адресуемой файловой системой, где каждый объект идентифицируется своим уникальным SHA-1 хешем, вычисленным на основе его содержимого.
Каждый объект коммита содержит следующую информацию:
tree(Дерево файлов): Ссылка на объект "дерево" (tree object), который представляет собой снимок состояния рабочего каталога на момент создания коммита. Объект "дерево" содержит ссылки на другие объекты "дерево" (для подкаталогов) и объекты "blob" (для файлов), а также их имена и права доступа. Это позволяет Git эффективно хранить только изменения, а не полные копии файлов.parent(s)(Родительские коммиты): Ссылка на один или несколько родительских коммитов. Для обычного коммита это один родитель, указывающий на предыдущее состояние истории. Для коммита слияния (merge commit) может быть два или более родителя, что формирует ветвящуюся историю.author(Автор): Имя и адрес электронной почты автора коммита, а также временная метка, когда изменения были фактически написаны.committer(Коммиттер): Имя и адрес электронной почты того, кто фактически применил коммит (это может быть другой человек, например, при применении патча), и временная метка, когда коммит был применен в репозиторий.message(Сообщение коммита): Описание изменений, внесенных в этом коммите.
Пример внутренней структуры коммита (полученной командой git cat-file -p <commit-hash>):
tree 92b8b6ffb9f3a0d5a3a0e7c8d9f0a1b2c3d4e5f6 # Ссылка на объект дерева
parent 1a410efbd13591db074050c56302540300000000 # Ссылка на родительский коммит
author John Doe <john@example.com> 1625097600 +0300 # Автор и время
committer John Doe <john@example.com> 1625097600 +0300 # Коммиттер и время
Initial commit # Сообщение коммита
Ключевые свойства хранения коммитов в Git:
- Неизменяемость: После создания коммит не может быть изменен. Любое изменение его содержимого (даже сообщения) приведет к созданию нового объекта коммита с новым SHA-1 хешем.
- Целостность: SHA-1 хеш гарантирует целостность данных. Любое повреждение данных коммита или его родителей будет немедленно обнаружено.
- Связанная история: Коммиты криптографически связаны друг с другом через ссылки на родителей, формируя направленный ациклический граф (DAG), который представляет полную историю проекта.