Ветка в Git – кратко – это указатель последовательности измененных файлов.
От любого файла при необходимости возможно создать несколько веток, которые будут означать наличие в файле тех или иных изменений как варианта альтернативного изменениям в других ветках, исходящих от этого же файла. Таким образом, файл, от которого расходятся несколько веток, становится узловым. При этом одна из веток назначается основной (master).
Работа с файлом, от которого пошло ветвление, в параллельных ветках происходит независимо, что позволяет оперативно производить выбор и находить требуемое решение в конструкции проекта.
Между ветками в проекте в Git можно с лёгкостью переключаться, ветки могут также сливаться между собой, образуя из своих файлов один «узловой» файл. То есть возможно сведение нескольких веток в один коммит.
Создание новой ветки в Git происходит с помощью команды git branch, и для ветки с именем experiment это можно организовать следующим образом:
$ git branch experiment
В результате появляются ветки master и experiment, указывающие на один и тот же коммит.
Слияние веток в Git – обратный процесс.
Допустим, следует произвести слияние каталога из 3-х файлов. Все их необходимо добавить в индекс и создать коммит.
При индексации происходит вычисление контрольной суммы каждого файла (SHA-1), каждый из файлов сохраняется в репозиторий, а контрольная сумма попадёт в индекс.
В Git такой файл называет blob-объект — большой бинарный объект:
$ git add README test.rb EXAMPLELICENSE
$ git commit -m ‘Initial commit’
При выполнении команды git commit, создающей коммит, Git вычисляет контрольные суммы каждого подкаталога, сохраняет его в репозитории как объект древа каталогов, а потом создаёт объект коммита с метаданными и указателем на основное дерево проекта, что даёт возможность воссоздать этот снимок в случае необходимости.
После выполнения операции в репозитории Git появится пять объектов: 3 blob-объекта (по одному на каждый файл из предыдущих коммитов), объект древа каталогов, содержащий список файлов и соответствующих им blob’ов, а также объект коммита, содержащий метаданные и указатель на объект древа каталогов.
Ветка в данной случае – перемещаемый указатель на один из предшествующих коммитов.
Указатель на основной ветке всегда указывает на последний коммит, даже если он создан на любой из иных веток проекта. То есть указатель на ветке master хронологически перемещается вместе с коммитами на других ветках и встаёт напротив последнего из них по времени создания.
Для того, чтобы пользователь мог понять, в какой ветке он непосредственно находится, используется специальный указатель HEAD, а визуализация вызывается с помощью команды git log (опиция называется decorate)
Результат вызова команды:
$ git log –oneline –decorate
k10zx (HEAD -> master, experiment) Add feature #15 – ability to add new formats to the central in 66ac6 Fix bug #1323 – stack overflow under certain conditions 96ca6 Initial comit
На коммит k10zx указывает как ветка master, так и experiment.
Переключение между ветками осуществляется командой git checkout.
Например, для переключения на ветку experiment необходимо ввести команду
$ git checkout experiment
В результате HEAD будет указывать на ветку experiment.
При развитии проекта создадим следующий коммит 15xd3, находясь на ветке experiment.
При этом он сохранится, даже если мы вернёмся обратно на ветку master, что автоматически вернёт нас на коммит k10zx.
Если по какой-либо причине возникла необходимость создать другой вариант проекта, отличный от коммита 15xd3, следует вернуться на предыдущий коммит k10zx, перейдя в ветку master, и создать новую ветвь от этого коммита.
2 комментария
Оставить комментарий