Команда git commit
записывает некоторое количество объектов tree и одного объекта commit , а затем сохраняет хеш-идентификатор одного объекта фиксации в текущей ветви.Набор древовидных объектов определяется содержимым индекса .Вы можете просмотреть это содержимое напрямую, используя git ls-files --stage
.
Время, необходимое для записи каждого из этих объектов, обычно довольно мало, поэтому в большинстве случаев git commit
почти мгновенно.Количество необходимых объектов дерева зависит от количества поддеревьев, необходимых для содержимого индекса.Это сложнее посчитать легко.Изучение количества косых черт в именах файлов в индексе - это начало, но если индекс содержит файлы a/b
, a/c
и т. Д. До a/z
, это всего лишь одно поддерево (для a/
) длявсе эти файлы.Если индекс содержит a/b/c
и a/c/d
, есть одно поддерево для b/
и одно для c/
без a/
, плюс дерево для a/
, что составляет три дерева.Так что просто подсчет косых черт завышает, иногда дико, в зависимости от того, насколько хорошо заполнено каждое поддерево.
Обратите внимание, что сами файлы уже хранятся в сжатом формате Git-only во время запуска git commit
.Если вы посмотрите на вывод git ls-files --stage
, вы увидите большой некрасивый хеш-идентификатор для каждого файла.Этот хэш-идентификатор представляет объект blob , в котором уже хранится содержимое файлов в хранилище.Команда git commit
просто ссылается на существующего содержимого: нет необходимости записывать новый файл.
(Время, необходимое для копирования файла из репозитория из его специальногосжатая форма Git-only к обычной форме на диске примерно пропорциональна размеру файла Время, затрачиваемое на копирование файла из обычной формы на диске в хранилище, во время git add
, также примерно пропорционально размеру файлаНо однажды фиксирует файл очень быстро. Переключение на другой коммит, имеющий ту же версию файла, не занимает много времени, так как Git замечает, что файл в индексе и в рабочем дереве соответствуетфайл в целевом коммите. Переключение на коммит, который имеет другую версию файла, требует извлечения файла из коммита и индекса в рабочее дерево, переходя в «копию из репозитория в обычный»форма "кейс".