Skip to main content

Git. Репозиторий

Git

В Git каждый коммит, дерево и файл хранятся в виде объектов. Эти объекты сохраняются в папке .git/objects. В этой папке хранятся все объекты, созданные в репозитории, включая коммиты, деревья и файлы.

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

Директории в папке объектов именуются с использованием первых двух символов хэша объекта. Например, если у объекта хэш bd15327a342b3adf6812f30957e6b09001, он будет храниться в директории .git/objects/bd/15327a342b3adf6812f30957e6b09001.

Файлы внутри этих директорий названы по имени хэша объекта. Например, файл для объекта с хэшем bd15327a342b3adf6812f30957e6b09001 будет иметь имя bd15327a342b3adf6812f30957e6b09001.

Каждый объект в Git имеет свой тип, который указывается в его заголовке. Например, типы объектов могут быть commit, tree или blob.

Использование уникальных хэшей SHA-1 для идентификации объектов позволяет Git эффективно управлять версиями проектов и предотвращать дублирование объектов. Это также обеспечивает целостность и безопасность данных в вашем репозитории.

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

    +------------------------+
| Working Directory |
| |
| (Untracked files) |
| (Modified files) |
| (Staged files) |
+------------------------+
| ^ |
| | |
| | git add | Подготовить
| v |
+------------------------+
| Index |
| |
| (Staged files) |
+------------------------+
| ^ |
| | |
| | git commit | Сохранить
| v |
+------------------------+ ^
| Repository | |
| | |
| (Commits) | git checkout - перейти к определенной версии
| (Branches) | (вернуть как было)
| (Tags) |
+------------------------+

При git checkout, гит берет объекты из репозитория и перемещает их в working directory. Рабочая директория перезаписывает файлы, что-то может появиться, что-то пропасть. Потому что в таком случае ваша директория находиться под контролем Git.