Привет, Хабр! Представляю вашему вниманию перевод статьи «Git для компьютерщиков» Томми Виртанен.
GIT изнутри: введение
Толкать: Время от времени я читал статьи о том, как «под капотом» работают различные популярные технологии, и наткнулся на это.Статья показалась интересной благодаря наличию простых и понятных схем, которые воспринимаются гораздо лучше, чем листы скучного текста.
Я решил перевести это на русский язык.
Изображения взяты из оригинала.
Кому будет интересно и, возможно, полезно: людям, которые работают с Git каждый день (то есть каждый второй, если не первый разработчик программного обеспечения) и желающие лучше понять механизм его работы.
Примечание: для лучшего понимания статьи следует иметь представление о таком звере, как направленный ациклический граф (DAG) .
Хранилище объектов
Хранилище объектов Git — это, грубо говоря, группа обеспечения доступности баз данных, содержащая различные типы объектов.Объекты хранятся в сжатом виде и идентифицируются хешами SHA-1 (это НЕ хэш содержимого файла, представляющего объект, а самого его представления в Git).
Блоб
Blob — это самый простой объект, просто набор байтов.
Это может быть файл, символическая ссылка или что-то еще.
Семантика определяется объектом, указывающим на этот большой двоичный объект.
Дерево
Объекты дерева описывают каталоги.
Они могут указывать на большие двоичные объекты, в которых хранится содержимое файлов, а также на другие деревья, создавая таким образом структуру подкаталогов.
Если узел указывает на другой узел в DAG, говорят, что он зависит от от этого узла, т.е.
не может существовать без него.
Узлы, на которые никто не указывает, можно удалить с помощью сборки мусора (команда мерзавец GC ), или восстанавливается с помощью команды git fsck --lost-found .
Совершить
Коммит — это дерево, которое представляет состояние файлов в Git на момент создания коммита.
Коммит также может ссылаться на другие коммиты, которые являются его родительскими:
- Если у коммита более одного родителя, это означает, что он описывает операцию слияния.
- Если у коммита нет родителей, это так называемый начальный коммит (т.е.
первый в репозитории)
- Также возможно, что в репозитории имеется более одного первоначального коммита — обычно это означает объединение двух отдельных репозиториев.
Рефы (ссылки)
Ссылки (или заголовки, или темы) похожи на стикеры, прикрепленные к узлам DAG, что-то вроде заметок или закладок «Я здесь работаю».
В отличие от узлов DAG, которые нельзя изменить, а можно только добавлять, ссылки можно перемещать по желанию.
Они не сохраняются в истории и не передаются напрямую между репозиториями.
Команда git совершить коммит добавляет новый узел в группу обеспечения доступности баз данных и перемещает на него закладку текущей ветки.
Ссылки находятся в пространстве имен руководители/название филиала , но часть головы можно опустить.
Ссылка выделяется ГОЛОВА — он указывает не на узел, а на другую ссылку — это указатель на текущую активную ветку.
Удаленные ссылки
Это, грубо говоря, наклейки разного цвета.
Разница в том, что удаленные ссылки находятся в другом пространстве имен и также управляются удаленным сервером.
Чтобы обновить их, используйте команду мерзавец принести .
Ярлык
Тег — это комбинация узла DAG и наклейки (другого цвета).
Тег указывает на фиксацию и включает в себя необязательное сообщение и подпись GPG. Стикер (ссылка) — простой способ получить доступ к метке, а в случае утери его можно восстановить командой git fsck --lost-found .
Таким образом, репозиторий Git представляет собой комбинацию DAG и ссылок.
История
Теперь, когда мы знаем, как Git хранит историю версий, давайте попробуем изобразить различные операции, а также понять, чем Git отличается от систем, которые представляют историю в виде линейных изменений для каждой ветки.
Самый простой репозиторий.
Мы просто скопировали( git-клон ) удаленный репозиторий с одним коммитом.
Вот мы и подумали( мерзавец принести ) удаленный репозиторий и получил 1 новый коммит, но еще не объединил его с нашей веткой.
Вот что происходит после выполнения команды git merge Remotes/MYSERVER/master .
Поскольку слияние выполняется как перемотка вперед (в нашей локальной ветке не было локальных коммитов), произошло следующее: изменились файлы нашей рабочей копии, а также переместился указатель на ветку.
Давайте сделаем это локально git совершить коммит , а потом мерзавец принести .
Теперь у нас есть как локальный, так и удаленный коммит. Очевидно, необходимо слить .
Это результат выполнения команды git merge Remotes/MYSERVER/master .
Поскольку у нас был локальный коммит, это уже не быстрая перемотка вперед, и для этого слияния в группе обеспечения доступности баз данных создается отдельный коммит. Обратите внимание, что у него есть 2 родительских коммита.
Вот как будет выглядеть наше дерево после нескольких коммитов в обе ветки (локальную и удаленную) + слияние.
Вы можете наглядно увидеть, как Git DAG записывает всю историю наших действий.
Однако такую историю читать трудно.
Если вы еще не опубликовали свою тему или договорились с другими членами команды, что им не следует основывать на ней свою работу, у вас есть альтернатива: вы можете сделать перебазировать для вашего филиала.
В этом случае ваш коммит заменяется другим коммитом с другим родителем, в который также перемещается ссылка на ветку.
В этом случае ваши старые коммиты останутся в группе обеспечения доступности баз данных до тех пор, пока не будет выполнена сборка мусора.
В принципе, это своего рода страховка на случай, если что-то пойдет не так.
Если у вас еще есть ссылки на старые коммиты, они будут сохранены до тех пор, пока ссылки существуют. НЕ следует перебазировать ветки, поверх которых другие люди сделали коммиты.
Восстановить их можно (и даже не очень сложно), но это вносит путаницу и массу бесполезной работы.
Вот как это выглядит после сбора мусора (или игнорирования недоступных коммитов) и создания нового коммита поверх ветки, к которой было применено перебазирование.
Также с помощью rebase вы можете перемещать несколько коммитов одновременно.
Вот и все.
Надеюсь, материал будет полезен.
Теги: #git #перевод #информатика
-
Способы Ввода Данных Из Дома
19 Oct, 24 -
Идеальные Требования И Как С Ними Справиться
19 Oct, 24 -
Usa Today Становится Социальной Сетью
19 Oct, 24