История в репозитории Git равна коммитам. Коммиты содержат как файлы, так и связь: каждый коммит имеет полный снимок всех файлов, а также хеш-код (-ы) своего родителя (-ей). Каждое имя ветки хранит хеш-идентификатор (единственное число) последнего коммита, и Git находит историю, начиная с конца и работая в обратном направлении, по одному родительскому элементу за раз.
Поскольку хэш-идентификатор каждого коммита является криптографической контрольной суммой содержимого этого коммита, включая родительский хэш, хэш-идентификатор последнего коммита зависит от хеш-идентификаторов каждого коммита в истории, сформированного, идя назад от этого коммита через любой другой достижимый коммит. (С технической точки зрения это форма дерево Меркле .)
Смысл всего этого заключается в том, что можно сохранить более короткую версию репозитория DAG общедоступной, а более длинную версию (короче плюс добавленные коммиты) в качестве приватной , но не возможно иметь публичную версию, которая пропускает некоторые исторические коммиты, сохраняя другие. Вы также можете или вместо этого использовать параллельные графы, то есть независимые группы обеспечения доступности баз данных: тот, который содержит публичную историю, и тот, который содержит частную историю. Если вы делаете это через подмодули Git, вы можете быть уверены, что не разглашаете личную информацию, но это накладывает сильное структурное ограничение: общедоступный материал должен быть подкаталогом.