Git Изнутри: Введение (Перевод)

Привет, Хабр! Представляю вашему вниманию перевод статьи «Git для компьютерщиков» Томми Виртанен.



GIT изнутри: введение

Толкать: Время от времени я читал статьи о том, как «под капотом» работают различные популярные технологии, и наткнулся на это.

этот материал .

Статья показалась интересной благодаря наличию простых и понятных схем, которые воспринимаются гораздо лучше, чем листы скучного текста.

Я решил перевести это на русский язык.

Изображения взяты из оригинала.

Кому будет интересно и, возможно, полезно: людям, которые работают с Git каждый день (то есть каждый второй, если не первый разработчик программного обеспечения) и желающие лучше понять механизм его работы.

Примечание: для лучшего понимания статьи следует иметь представление о таком звере, как направленный ациклический граф (DAG) .



Хранилище объектов

Хранилище объектов Git — это, грубо говоря, группа обеспечения доступности баз данных, содержащая различные типы объектов.

Объекты хранятся в сжатом виде и идентифицируются хешами SHA-1 (это НЕ хэш содержимого файла, представляющего объект, а самого его представления в Git).



Блоб



GIT изнутри: введение (перевод)

Blob — это самый простой объект, просто набор байтов.

Это может быть файл, символическая ссылка или что-то еще.

Семантика определяется объектом, указывающим на этот большой двоичный объект.

Дерево



GIT изнутри: введение (перевод)

Объекты дерева описывают каталоги.

Они могут указывать на большие двоичные объекты, в которых хранится содержимое файлов, а также на другие деревья, создавая таким образом структуру подкаталогов.

Если узел указывает на другой узел в DAG, говорят, что он зависит от от этого узла, т.е.

не может существовать без него.

Узлы, на которые никто не указывает, можно удалить с помощью сборки мусора (команда мерзавец GC ), или восстанавливается с помощью команды git fsck --lost-found .



Совершить



GIT изнутри: введение (перевод)

Коммит — это дерево, которое представляет состояние файлов в Git на момент создания коммита.

Коммит также может ссылаться на другие коммиты, которые являются его родительскими:

  • Если у коммита более одного родителя, это означает, что он описывает операцию слияния.

  • Если у коммита нет родителей, это так называемый начальный коммит (т.е.

    первый в репозитории)

  • Также возможно, что в репозитории имеется более одного первоначального коммита — обычно это означает объединение двух отдельных репозиториев.

Тело объекта фиксации зафиксировать сообщение (сообщение).



Рефы (ссылки)



GIT изнутри: введение (перевод)

Ссылки (или заголовки, или темы) похожи на стикеры, прикрепленные к узлам DAG, что-то вроде заметок или закладок «Я здесь работаю».

В отличие от узлов DAG, которые нельзя изменить, а можно только добавлять, ссылки можно перемещать по желанию.

Они не сохраняются в истории и не передаются напрямую между репозиториями.

Команда git совершить коммит добавляет новый узел в группу обеспечения доступности баз данных и перемещает на него закладку текущей ветки.

Ссылки находятся в пространстве имен руководители/название филиала , но часть головы можно опустить.

Ссылка выделяется ГОЛОВА — он указывает не на узел, а на другую ссылку — это указатель на текущую активную ветку.



Удаленные ссылки



GIT изнутри: введение (перевод)

Это, грубо говоря, наклейки разного цвета.

Разница в том, что удаленные ссылки находятся в другом пространстве имен и также управляются удаленным сервером.

Чтобы обновить их, используйте команду мерзавец принести .



Ярлык



GIT изнутри: введение (перевод)

Тег — это комбинация узла DAG и наклейки (другого цвета).

Тег указывает на фиксацию и включает в себя необязательное сообщение и подпись GPG. Стикер (ссылка) — простой способ получить доступ к метке, а в случае утери его можно восстановить командой git fsck --lost-found .

Таким образом, репозиторий Git представляет собой комбинацию DAG и ссылок.



История

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



GIT изнутри: введение (перевод)

Самый простой репозиторий.

Мы просто скопировали( git-клон ) удаленный репозиторий с одним коммитом.



GIT изнутри: введение (перевод)

Вот мы и подумали( мерзавец принести ) удаленный репозиторий и получил 1 новый коммит, но еще не объединил его с нашей веткой.



GIT изнутри: введение (перевод)

Вот что происходит после выполнения команды git merge Remotes/MYSERVER/master .

Поскольку слияние выполняется как перемотка вперед (в нашей локальной ветке не было локальных коммитов), произошло следующее: изменились файлы нашей рабочей копии, а также переместился указатель на ветку.



GIT изнутри: введение (перевод)

Давайте сделаем это локально git совершить коммит , а потом мерзавец принести .

Теперь у нас есть как локальный, так и удаленный коммит. Очевидно, необходимо слить .



GIT изнутри: введение (перевод)

Это результат выполнения команды git merge Remotes/MYSERVER/master .

Поскольку у нас был локальный коммит, это уже не быстрая перемотка вперед, и для этого слияния в группе обеспечения доступности баз данных создается отдельный коммит. Обратите внимание, что у него есть 2 родительских коммита.



GIT изнутри: введение (перевод)

Вот как будет выглядеть наше дерево после нескольких коммитов в обе ветки (локальную и удаленную) + слияние.

Вы можете наглядно увидеть, как Git DAG записывает всю историю наших действий.



GIT изнутри: введение (перевод)

Однако такую историю читать трудно.

Если вы еще не опубликовали свою тему или договорились с другими членами команды, что им не следует основывать на ней свою работу, у вас есть альтернатива: вы можете сделать перебазировать для вашего филиала.

В этом случае ваш коммит заменяется другим коммитом с другим родителем, в который также перемещается ссылка на ветку.

В этом случае ваши старые коммиты останутся в группе обеспечения доступности баз данных до тех пор, пока не будет выполнена сборка мусора.

В принципе, это своего рода страховка на случай, если что-то пойдет не так.

Если у вас еще есть ссылки на старые коммиты, они будут сохранены до тех пор, пока ссылки существуют. НЕ следует перебазировать ветки, поверх которых другие люди сделали коммиты.

Восстановить их можно (и даже не очень сложно), но это вносит путаницу и массу бесполезной работы.



GIT изнутри: введение (перевод)

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



GIT изнутри: введение (перевод)

Также с помощью rebase вы можете перемещать несколько коммитов одновременно.

Вот и все.

Надеюсь, материал будет полезен.

Теги: #git #перевод #информатика

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.