Индекс Git

Индекс это бинарный файл (обычно находится в .git/index) содержащий отсортированный список имен путей, каждый с разрешениями и SHA1 значениями объекта блоба; git ls-files покажет вам содержимое индекса:

$ git ls-files --stage
100644 63c918c667fa005ff12ad89437f2fdc80926e21c 0   .gitignore
100644 5529b198e8d14decbe4ad99db3f7fb632de0439d 0   .mailmap
100644 6ff87c4664981e4397625791c8ea3bbb5f2279a3 0   COPYING
100644 a37b2152bd26be2c2289e1f57a292534a51a93c7 0   Documentation/.gitignore
100644 fbefe9a45b00a54b58d94d06eca48b03d40a50e0 0   Documentation/Makefile
...
100644 2511aef8d89ab52be5ec6a5e46236b4b6bcd07ea 0   xdiff/xtypes.h
100644 2ade97b2574a9f77e7ae4002a4e07a6a38e46d07 0   xdiff/xutils.c
100644 d5de8292e05e7c36c4b68857c1cf9855e3d2f70a 0   xdiff/xutils.h

Замечание, в старой документации вы возможно встретите определение индекса "current directory cache(кэш текущей директории)" или просто "cache(кэш)". Он имеет три важдых свойства:

  1. Индекс содержит всю информацию необходимую чтобы сгенерировать один (уникальный) объект дерево.

    Например, выполнение git commit сгенерирует этот объект дерево из индекса, сохранит его в базе данных объектов, и использует его как объект дерево связанный с новым коммитом.

  2. Индекс разрешает быстрое сравнение между объектом дерево которое он определяет и рабочим деревом.

    Он делает это сохраняя некоторую дополнительную информацию каждой записи (такой как время последней модификации). Эти данные не отображаются выше, и не сохраняются в созданном объекте дерево, но они могут быть использованы чтобы быстро определить какие файлы в рабочей директории отличаются от тех что в индексе, и поэтому предохраняет git от постоянного чтения всех данных из таких файлов в поисках изменений.

  3. Он может эффективно предствить информацию о конфликтах при слиянии между различными объектами дерево, позволяя каждому пути быть связанным с достаточной информацией о вовлеченных деревьях, и вы можете создавать слияние между ними в три способа.

    В процессе слияния, индекс может хранить множество версий одного файла (называемых "stages(заморозка)"). Третья колонка в выводе git ls-files выше это номер заморозки, и примет значения отличные от 0 для файлов с конфликтами при слиянии.

Индекс это своего рода временная область заморозки, которая заполняется деревом над котором вы в процессе работы.



github logo