Внутри Git: объекты и хеширование
Git работает быстро и надежно благодаря способу хранения данных. Чтобы освоить Git, необходимо понимать содержимое директории .git. Эта скрытая папка содержит всё, что нужно Git для отслеживания вашего проекта.
Git использует четыре основных типа объектов для управления вашей работой:
- Blobs: хранят содержимое файлов.
- Trees: хранят структуру каталогов и имена файлов.
- Commits: хранят снимки вашего проекта и метаданные.
- Tags: хранят ссылки на конкретные версии.
Git идентифицирует всё с помощью хеширования. Он использует алгоритм SHA-1, чтобы превратить данные в уникальный идентификатор. Этот ID служит своего рода «отпечатком пальца». Если вы измените хотя бы один символ в файле, хеш изменится полностью.
Как Git создает снимок:
Когда вы делаете коммит файла, Git создает цепочку объектов.
- Blob хранит фактический текст или данные вашего файла.
- Tree сопоставляет этот blob с конкретным именем файла и путем к папке.
- Commit связывает дерево с автором, временной меткой и сообщением.
Git не хранит изменения или «дельты». Он хранит снимки. Каждый раз, когда вы делаете коммит, Git создает новые объекты. Это делает вашу историю неизменяемой и позволяет легко восстанавливать данные.
Понимание этой структуры поможет вам исправлять ошибки, восстанавливать потерянные данные и управлять сложными ветками.
Попробуйте этот мини-проект, чтобы увидеть всё в действии:
Инициализируйте репозиторий: mkdir git-lab cd git-lab git init
Создайте файл и найдите его хеш: echo 'Hello Git' > hello.txt git hash-object hello.txt
Сохраните файл как blob: git hash-object -w hello.txt
Проверьте тип объекта и его содержимое: git cat-file -t [YOUR_HASH] git cat-file -p [YOUR_HASH]
Создайте коммит и посмотрите на дерево: git add hello.txt git commit -m 'Initial commit' git ls-tree HEAD
Заглянув «под капот», вы увидите, что Git — это не просто инструмент контроля версий. Это высокоорганизованная база данных объектов, адресуемых по содержимому.
Source: https://dev.to/lotanna_obianefo/inside-git-objects-hashing-44gc
Optional learning community: https://t.me/GyaanSetuAi
