Что значит индексация в контексте Git?
Начал разбираться в системе контроле версий Git и понял что не могу понять, что означает термин индексация. Приведу пример :
Изменения файла hello.html были проиндексированы. Это означает, что git теперь знает об изменении, но изменение пока не перманентно (читай, навсегда) записано в репозиторий. Следующий коммит будет включать в себя проиндексированные изменения.Если вы решили, что не хотите коммитить изменения, команда состояния напомнит вам о том, что с помощью команды git reset можно снять индексацию этих изменений.
Так вот вопрос, как здесь понимать индексацию?
Ответы (6 шт):
Это означает, что git теперь знает какие именно изменения были сделаны в файле.
В английской версии оно выглядит так:
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 нам показывает два списка файлов:
Changes to be committed:(выводятся зеленым) — это разница между последним коммитом и индексом, то, что попадет в коммит.Changes not staged for commit:(выводятся красным) — это разница между индексом и рабочей копией, то, что в коммит не попадет.
что такое индексирование?
индексирование (также: 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 все эти оптимизации «идут коту под хвост»: выполняется и поиск и сжатие).
Индекс в git - это черновик коммита.
Индексирование/индексацию - добавление в индекс.
А можно, чтобы было проще для моего неокрепшего мозга, представить себе индекс как буфер, в котором предварительно сохраняются все изменения перед фиксацией/commit`ом? Не факт, что все изменения будут закоммичены/зафиксированы. Возможно, часть из них будет отменена, другая часть сгруппирована и пойдет одним коммитом, третьи пойдут отдельными коммитами. Это не попытка, что-то оспорить или опровергнуть. Это моё сложившееся видение индекса простым, для меня, языком. Написал, чтобы более знающие люди поправили меня, если я не прав или, наоборот, подтвердили мое понимание. Ну, и, возможно, новичкам будет проще въехать в тему. Заранее благодарю за конструктивную критику.