Что значит индексация в контексте Git?

Начал разбираться в системе контроле версий Git и понял что не могу понять, что означает термин индексация. Приведу пример :

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

Так вот вопрос, как здесь понимать индексацию?


Ответы (6 шт):

Автор решения: Эникейщик

Это означает, что git теперь знает какие именно изменения были сделаны в файле.

→ Ссылка
Автор решения: vp_arth

В английской версии оно выглядит так:

Changes to the hello.html have been staged.

Тут речь про staging. Изменения выбраны, но в коммит ещё не добавлены)
Другими словами, выполнен git add, но git commit пока нет.

staging — это просто промежуточный этап, который позволяет выбрать, какие именно изменения будут добавлены в следующий коммит.

Индекс стейджинг этапа - это некий слепок содержимого рабочей директории, который и будет использован при коммите. Если файлы были изменены после git add, при коммите будет зафиксировано их состояние в индексе.

В git status эти изменения отображаются отдельно, зелёным цветом)

→ Ссылка
Автор решения: Герман Борисов

Индекс - это временный коммит, которого еще нет в истории.

При выполнении команды git commit именно индекс, а не текущее состояние рабочей копии становится новым коммитом. Сразу после выполнения commit или checkout индекс совпадает с последним коммитом текущей ветки.

git add помещает текущее состояние файла в индекс. Это и есть индексация.

git status нам показывает два списка файлов:

  1. Changes to be committed: (выводятся зеленым) — это разница между последним коммитом и индексом, то, что попадет в коммит.
  2. Changes not staged for commit: (выводятся красным) — это разница между индексом и рабочей копией, то, что в коммит не попадет.
→ Ссылка
Автор решения: aleksandr barakin

что такое индексирование?

индексирование (также: indexing, staging) — это процесс добавления текущего содержимого (изменённого) файла в индекс (также: index area, staging area).


какой командой выполняется это добавление?

командой add:

$ git add файл

что при этом происходит с технической точки зрения?

берётся содержимое файла, впереди к нему дописывается немного служебной информации, высчитывается sha1sum от получившегося (это т.н. хэш), затем всё это сжимается и сохраняется в файле в каталоге .git/objects. имя файла уникально, т.к. формируется на основании полученного хэша.
затем в файл .git/index дописывается ещё одна запись о добавленном файле (сохраняется имя файла, а также тот самый хэш, и ещё некоторое количество служебной информации):

| файл         | хэш | ... |
| каталог/файл | хэш | ... |

и что, этот файл .git/index всё растёт и растёт? он же станет со временем гигантского размера!

этот файл полностью очищается после выполнения команды commit (именно из него программа git черпает информацию о том, какие именно изменения должны быть зафиксированы с помощью commit-а). среди других команд, добавляющих либо удаляющих записи в этом файле, стоит отметить reset, rm, stash.


так для чего он вообще нужен, этот «индекс»?

с технической точки зрения основная цель его существования — избежать (ресурсоёмких) операций с файлами в рабочем каталоге (working tree) при выполнении команды commit. благодаря его наличию при выполнении команды commit не производится никаких манипуляций с файлами в рабочем каталоге — ни поиск изменённых файлов, ни сжатие их текущего содержимого. (оговорка: при наличии опций -a/--all/-p/--patch/--interactive команды commit все эти оптимизации «идут коту под хвост»: выполняется и поиск и сжатие).

→ Ссылка
Автор решения: Pavel Mayorov

Индекс в git - это черновик коммита.

Индексирование/индексацию - добавление в индекс.

→ Ссылка
Автор решения: Ace_Ventura

А можно, чтобы было проще для моего неокрепшего мозга, представить себе индекс как буфер, в котором предварительно сохраняются все изменения перед фиксацией/commit`ом? Не факт, что все изменения будут закоммичены/зафиксированы. Возможно, часть из них будет отменена, другая часть сгруппирована и пойдет одним коммитом, третьи пойдут отдельными коммитами. Это не попытка, что-то оспорить или опровергнуть. Это моё сложившееся видение индекса простым, для меня, языком. Написал, чтобы более знающие люди поправили меня, если я не прав или, наоборот, подтвердили мое понимание. Ну, и, возможно, новичкам будет проще въехать в тему. Заранее благодарю за конструктивную критику.

→ Ссылка