Почему Git хранит файл в хранилище, когда я просто добавляю его в область подготовки?

Из того, что я понимаю, когда ты git add файл, он просто размещает файл перед его добавлением в репозиторий, но почему я могу увидеть, что он был добавлен в репозиторий g it, прежде чем я его зафиксировал?

Например, если я создаю новый репозиторий g it и создаю новый файл с именем foo и добавьте в него содержимое "Hello World", а затем git add fooЯ вижу новый предмет в objects подкаталог внутри .git папка. Я даже могу просмотреть содержимое нового файла внутри objects файл с git cat-file -p команда.

Что именно было добавлено в .git/objects папка? Что технически делает подготовка файла? Например, какие шаги предпринимаются после git add запускается на файл? Может быть, я пойму это лучше, если буду знать шаги.

2 ответа

Решение

Зона подготовки является частью хранилища.

Я думаю, что вы путаете объектную базу данных хранилища с историей. Только коммиты являются частью истории, но все объекты Git-дескрипторы являются частью базы данных объектов.

Подумайте об этом: Git не остается в памяти, поэтому где еще он будет записывать, что является частью промежуточной области, чем в его объектной базе данных?

Я даже могу просмотреть содержимое нового файла внутри файла объектов с помощью команды git cat-file -p.

Или же git diff --cached,

Что именно было добавлено в .git/objects папка?

Смотрите " Git Internals - Git Objects "

Вы можете увидеть файл в каталоге объектов. Так Git изначально сохраняет контент - в виде одного файла на единицу контента, названного с помощью контрольной суммы SHA-1 контента и его заголовка. Подкаталог именуется первыми 2 символами SHA-1, а имя файла - оставшимися 38 символами.

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

Не забывай это с git add -p (--patch) вы можете добавить части (фрагменты) файла перед фиксацией.

Цель индекса остается (в контексте git add) подготовить следующий коммит.
Он отражает первоначальную потребность в Git, созданную Линусом Торвальдсом в 2005 году, для интеграции патчей (сначала это был просто менеджер слияний)

какие шаги выполняются после запуска git add для файла

В то время как индекс не содержит содержимого файла, объект.objects делает это с незакрепленным (неупакованным) объектом:

См. Хранение объектов для шагов

  • Git создает заголовок, который начинается с типа объекта, в данном случае BLOB-объекта. Затем он добавляет пробел, за которым следует размер содержимого и, наконец, нулевой байт.
  • Git объединяет заголовок и исходное содержимое, а затем вычисляет контрольную сумму SHA-1 для этого нового содержимого.
  • Git сжимает новый контент с помощью zlib,
  • Наконец, Git записывает содержимое zlib-deflated в объект на диске. Git определяет путь к объекту, который вы хотите записать (первые два символа значения SHA-1 - это имя подкаталога, а последние 38 символов - это имя файла в этом каталоге)
Другие вопросы по тегам