Refs и HEAD
Тема дорожной карты · Изучи Git
Refs — это человекочитаемые имена, которые ссылаются на SHA-хеши коммитов. Они хранятся в директории .git/refs/ (или, при упаковке, в .git/packed-refs). Ветки находятся в refs/heads/*, теги — в refs/tags/*, а remote-tracking в refs/remotes/<remote>/*. Особое место занимает HEAD, который обычно является символической ссылкой вида ref: refs/heads/main, но в режиме detached хранит прямой SHA-хеш. Для безопасной работы рекомендуется использовать команды git update-ref, git symbolic-ref и git for-each-ref при написании скриптов. Суффикс ^{} «развоплощает» аннотированный тег до коммита, что может быть полезно в процессах CI/CD.
Как это работает
Refs и HEAD: раскладка .git-директории включает в себя директорию objects/, содержащую blobs, trees, commits, tags, а также упакованные в .pack-файлы для повышения эффективности. В директории refs/ находятся файлы с SHA-хешами для веток, тегов и remote-tracking. Директория HEAD содержит текущий ref, а также другие файлы, такие как config, hooks/, index (staging area, бинарный формат), logs/ (reflog) и packed-refs (collapsed refs). Plumbing-команды, такие как hash-object, cat-file, update-ref, write-tree, commit-tree, являются строительными блоками, из которых porcelain-команды компонуются.
Когда применять
Изучение внутренностей Git полезно, когда вы начинаете писать собственные Git-тулзы, дебажить экзотические проблемы или просто интересуетесь внутренним устройством системы. Прочтите главу 10 книги Pro Git — это канонический ресурс для изучения внутренней структуры Git. Попробуйте самостоятельно реализовать команды git add и git commit через plumbing-команды, чтобы лучше понять, как они работают. Это поможет вам понять, как функционируют другие команды Git. Полезно для восстановления из очень сломанных состояний, например, когда index был испорчен.
Типичные ошибки
Типичные ловушки при работе с Refs и HEAD включают прямую правку файлов в директории .git/ без использования команд, таких как git update-ref, что может привести к корректировке инвариантов и, как следствие, к коррупции репозитория. Также стоит быть осторожным при запуске неизвестных plumbing-команд из интернета, поскольку некоторые из них могут быть нестабильными или даже вредоносными. Наконец, важно различать plumbing и porcelain в скриптах, так как формат вывода porcelain нестабилен и может изменяться, что затрудняет использование этих команд в скриптах.