Бэкэнд GIT (ЗА КУЛИСАМИ)
Введение
Я копался во внутренностях Git, чтобы действительно понять инструмент. помимо основ и получить глубокое понимание того, как git делает то, чем он известен — Управление версиями. В этой статье я намерен поделиться с вами своими открытиями, раскрывая внутренности git максимально простым языком, чтобы любой пользователь Git мог понять основные концепции этого удивительного инструмента.
Важный : эта статья не является введением в материал Git, но предназначена для того, чтобы показать вам, как Git может отслеживать различные версии файлов вашего проекта. Если вы новичок в Git, следуйте этому Git-документация чтобы прочитать документацию или скачать программа чтобы получить отличное объяснение основ Git, вы можете вернуться, чтобы прочитать эту статью для более глубокого погружения в Git.
GIT FRONT-END (что вы уже знаете)
Вы наверняка уже знаете, что Git по своей сути является системой контроля версий (VCS), используемой людьми (Теперь я не говорю, что разработчики, любой может использовать git, например, я использовал git, чтобы отслеживать различные версии этой статьи, когда я писал и вносил изменения перед публикацией.), чтобы отслеживать различные версии/итерации своих файлов проекта (документов).
До Git существовало множество VCS, например, CVS, subversion, perforce, и все они относятся к категории Центральная система контроля версий (CVCS) это означает, что все файлы с версиями хранятся в одной базе данных, и каждый другой человек (клиент), работающий с этим проектом или над ним, должен будет подключаться к центральной базе данных (все коммиты попадают в эту единую базу данных).
Git, с другой стороны, подпадает под категорию Распределенная система контроля версий (DVCS), что означает, что нет центральной базы данных, в которую люди должны отправлять или сохранять файлы. Каждый компьютер пользователя Git служит базой данных для файлов, это означает, что каждый, кто работает над проектом, имеет всю историю проекта, живущую на их локальном компьютере, на момент клонирования проекта. Итак, где находится эта база данных на вашем компьютере? я почти уверен, что если вы проверите каталог своего проекта, где вы используете Git, вы увидите только подкаталоги и файлы вашего проекта. Я бы разоблачил эту магию Git inbit
ВНУТРЕННИЕ УСТРОЙСТВА GIT
Что делает каталог проекта репозиторием git, так это скрытый .git directory
живет в этом каталоге проекта. .git папка содержит Git База данных объектов и здесь происходит магия Git. Эта папка намеренно скрыта, чтобы избежать историй, которые затрагивают сердце (изменения файлов, ошибки) и для поддержания целостности Git. Если вы специалист по Windows, вы можете просмотреть эту папку, включив show hidden files
особенность, следуйте этому руководству, если вы не знаете, как это сделатьесли вы пользователь Mac, вот твоя ссылка.
каталог .git содержит некоторые другие каталоги и файлы, и это выглядит так:
- .git/
- hooks
- info/
- exclude
- objects/
- info
- pack
- refs/
- heads
- tags
- config
- description
- HEAD
Git может эффективно управлять различными версиями вашего проекта, поскольку он предназначен для отслеживания содержимого файлов и сохранения отслеживаемого содержимого в виде Объекты в База данных объектов.
КАТАЛОГ ОБЪЕКТОВ
Git работает как файловая система с адресацией по содержимому, что означает, что Git хранит свои файлы (объекты) с использованием key:value
парный формат, где ключ — это адрес, по которому Git хранит содержимое (называемое объектами), которое является значением.
Git использует SHA-1 (алгоритм безопасного хеширования) для создания уникального ключа для каждого объекта хранится. SHA-1 генерирует 40-символьный буквенно-цифровой символ для ссылки на объекты, хранящиеся в базе данных объектов, например f7de3a39b026386f8f826bc230a112ae792ec035
Этот каталог объектов это место, где Git хранит каждый объект, т.е. каталог объектов — это объектная база данных.
Git хранит в базе данных объектов (каталог объектов) три основных типа объектов:
Объект Blobs — Git хранит содержимое файлов в виде больших двоичных объектов. Важно отметить, что большие двоичные объекты не включают имя файла или режим файла, а являются строго содержимым файлов, для которых Git создает версии. SHA-1 служит именем файла (ключом) для содержимого (значения) большого двоичного объекта.
Объект дерева — Объекты дерева похожи на каталоги, они содержат объекты больших двоичных объектов и другие объекты дерева. Объекты дерева — это снимки вашего рабочего каталога на момент вашего последнего коммита.
Фиксировать объект — Объекты фиксации в основном хранят сведения о последней фиксации текущей проверенной ветки (на это ссылаются как родитель ), указатель на текущий объект дерева для фиксации, имя коммиттера и фактическое сообщение фиксации.
Типы объектов Git организованы в подкаталоги, которые git автоматически создает при попытке сохранить объекты. Подкаталог именуется с использованием первых двух символов SHA-1, а объект хранится в файле с именем с использованием оставшихся 38 хеш-ключей.
Objects/
f7/
de3a39b026386f8f826bc230a112ae792ec035
GIT В ДЕЙСТВИИ
В этом разделе мы немного проверим версии и посмотрим, как объекты Git создаются и хранятся в базе данных объектов, я думаю, к концу этого раздела все станет более понятным.
я буду работать с git bash для демонстраций.
Откройте свой терминал/cmd и перейдите в любой каталог по вашему выбору и введите команду
$ git init
для создания пустого репозитория Git. В моем случае я получил сообщениеInitialized empty Git repository in C:/Users/opara prosper/Desktop/GitHub Projects/Git-Backend/.git/
вы наверняка получите подобное сообщение, но с другим каталогом.Откройте новый терминал и перейдите в каталог проекта и поместите оба терминала рядом, это позволит нам отслеживать, что происходит внутри каталога .git.
Создать новый файл
example.txt
содержатьHello world
как это содержание — вы можете сделать это со своего терминала, введя следующую командуcat > example.txt
затем введите содержимое в новой строке, сохраните и выйдите с помощью CTRL ДНа втором терминале, который вы открыли, введите эту команду
find .git/objects -type f
вы не получите никакого ответа, потому что в каталоге объектов ничего нет, но это скоро изменится.Теперь на первом терминале, который мы изначально открыли, введите команду
git add example.txt
чтобы переместить файл в промежуточную область.Вернитесь ко второму терминалу, который вы открыли, и введите
find .git/objects -type f
. Теперь вы получите ответ, который выглядит так.git/objects/70/c379b63ffa0795fdbfbc128e5a2818397b7ef8
ваш будет другим, потому что SHA-1 создает случайные ключи для объектов git. Это означает, что объект был добавлен в базу данных объектов Git, но мы еще не знаем, что это такое. Если вы наберетеgit cat-file -p 70c379b63ffa0795fdbfbc128e5a2818397b7ef8
ты бы заметил Привет, мир возвращается, но имя файла example.txt нигде не найдено, это подтверждает мое заявление о том, что Git является средством отслеживания контента.
Когда вы запустили git add example.txt
Команда Git захватила содержимое файла eample.txt, сжала его в базу данных объектов git и присвоила ему уникальный идентификатор. 70c379b63ffa0795fdbfbc128e5a2818397b7ef8 с помощью SHA-1. Чтобы проверить тип объекта, введите следующую команду git cat-file -t 70c379b63ffa0795fdbfbc128e5a2818397b7ef8
в нашем случае капля возвращается, что означает, что вновь созданный объект является объектом большого двоичного объекта.
Вернувшись к нашему первому терминалу, введите следующую команду
git commit -m "I created an example.txt file"
для фиксации ваших изменений (т. е. для перемещения ваших изменений из промежуточной области в каталог .git).Вернитесь ко второму терминалу и введите
find .git/objects -type f
на этот раз вы заметите, что в моем случае в каталог объектов были добавлены два новых объекта;
.git/objects/70/c379b63ffa0795fdbfbc128e5a2818397b7ef8
.git/objects/7a/68edc879868601bf427c8c2238bbc8752c33b3
.git/objects/f2/9f2741b30ecc1529da7dbae4aff9974b69e271
Давайте проверим эти объекты, возьмем любой объект и напечатаем git cat-file -t 7a68edc879868601bf427c8c2238bbc8752c33b3
. В моем случае commit
был возвращен, и это означает, что этот объект является зафиксировать объект чтобы просмотреть этот объект, измените -t
флаг из нашей предыдущей команды в -p
то есть git cat-file -p 7a68edc879868601bf427c8c2238bbc8752c33b3
вы получите ответ, который выглядит следующим образом;
tree f29f2741b30ecc1529da7dbae4aff9974b69e271
author OPARA-PROSPER <oparaprosper79@gmail.com> 1541583214 +0100
committer OPARA-PROSPER <oparaprosper79@gmail.com> 1541583214 +0100
I created an example.txt file
Давайте внимательно посмотрим, что это означает. Первая линия дерево — это указатель на второй объект, который был создан при последней фиксации (этот объект всегда является древовидным объектом), вторая и третья строки содержат информацию о том, кто сделал фиксацию, а последняя строка содержит сообщение фиксации.
- Теперь мы проверим второй объект, который был создан вместе с фиксацией, используя
git cat-file -t f29f2741b30ecc1529da7dbae4aff9974b69e271
. Аtree
возвращается ответ, что означает, что объект является деревом, мы можем просмотреть содержимое этого объекта дерева, изменив-t
пометить-p
то естьgit cat-file -p f29f2741b30ecc1529da7dbae4aff9974b69e271
это вернет ответ, который выглядит следующим образом;
100644 blob 70c379b63ffa0795fdbfbc128e5a2818397b7ef8 example.txt
Вспомните из моего объяснения, что древовидные объекты подобны каталогам, которые содержат большие двоичные объекты и другие деревья, а также являются моментальными снимками текущего состояния вашего рабочего каталога во время вашей последней фиксации. Единственный файл в нашем рабочем каталоге на момент последнего коммита — это пример.txt файл, и это то, что содержит наш объект дерева, но на этот раз это объект большого двоичного объекта, который был создан, когда мы запустили команду git add для внесения наших изменений. Это так, потому что Git отслеживает не файлы, а содержимое.
Наш объект дерева содержит информацию о режиме файла (100644, что означает, что это обычный файл), типе объекта, ключе SHA-1 и имени файла, из которого было извлечено содержимое.
ЗАВОРАЧИВАТЬ
Чем больше изменений вы сделаете, подготовите и зафиксируете, тем больше новых больших двоичных объектов, деревьев и объектов фиксации будет создано и на них будет ссылаться база данных объектов.
В заключение, это то, как Git работает под капотом, чтобы отслеживать изменения, которые мы вносим в файлы нашего проекта.