Belov Solutions

О ветвлении в Git: подробное руководство

Введение

Эта статья объясняет, как работает ветвление в Git, включая хранение данных, создание и переключение веток, а также визуализацию истории коммитов. Вы узнаете, как Git использует снимки (snapshots) и указатели для управления ветками. Примеры приведены для Linux и Windows.

Как Git хранит данные

Git не сохраняет данные как последовательность изменений, а использует снимки (snapshots). Каждый коммит — это объект, содержащий:

  • Указатель на снимок подготовленных данных.
  • Метаданные: имя автора, email, сообщение.
  • Указатель на родительский коммит (или коммиты для слияний).

Пример: у вас есть каталог с файлами README, test.rb и LICENSE. Вы добавляете их в индекс и создаёте коммит:

Linux/Windows

git add README test.rb LICENSE
git commit -m 'Initial commit'

Git вычисляет контрольную сумму SHA-1 для каждого файла, сохраняет их как блобы (бинарные объекты) в репозитории, а контрольные суммы — в индекс. Затем создаётся объект дерева каталогов (содержащий список файлов и их блобов) и объект коммита с метаданными и указателем на дерево.

Структура коммита

После первого коммита репозиторий содержит:

  • Три блоба (по одному для каждого файла).
  • Объект дерева каталогов.
  • Объект коммита с указателем на дерево.

Последующий коммит включает указатель на предыдущий коммит, формируя историю.

Что такое ветка в Git

Ветка — это перемещаемый указатель на коммит. По умолчанию основная ветка называется master (или main в новых версиях Git). Она автоматически обновляется при каждом коммите, указывая на последний коммит.

Примечание: Ветка master не имеет особого статуса — это просто имя по умолчанию, создаваемое командой git init.

Создание новой ветки

Создайте новую ветку testing:

Linux/Windows

git branch testing

Это создаёт новый указатель на текущий коммит, но не переключает на новую ветку. Указатель HEAD определяет текущую ветку и остаётся на master.

Проверьте указатели веток:

git log --oneline --decorate
f30ab (HEAD -> master, testing) Add feature #32 - ability to add new formats to the central interface
34ac2 Fix bug #1328 - stack overflow under certain conditions
98ca9 Initial commit

Обе ветки (master и testing) указывают на коммит f30ab.

Переключение веток

Переключитесь на ветку testing:

Linux/Windows

git checkout testing

Указатель HEAD перемещается на testing. Внесите изменения и создайте коммит:

vim test.rb
git commit -a -m 'made a change'

Ветка testing обновляется, указывая на новый коммит, а master остаётся на прежнем.

Вернитесь на master:

git checkout master

Это перемещает HEAD на master и возвращает файлы в рабочем каталоге к состоянию последнего коммита master.

Примечание: Переключение веток изменяет файлы в рабочем каталоге. Если Git не может выполнить переключение (например, из-за конфликтов), он предотвратит операцию.

Работа с разветвлённой историей

Внесите изменения на ветке master:

Linux/Windows

vim test.rb
git commit -a -m 'made other changes'

Теперь история проекта разделилась: ветки master и testing содержат разные коммиты. Вы можете переключаться между ними и объединять их при необходимости.

Визуализируйте историю:

git log --oneline --decorate --graph --all
* c2b9e (HEAD, master) Made other changes
| * 87ab2 (testing) Made a change
|/
* f30ab Add feature #32 - ability to add new formats to the central interface
* 34ac2 Fix bug #1328 - stack overflow under certain conditions
* 98ca9 initial commit

Эффективность ветвления в Git

Ветка в Git — это файл с 40-символьной SHA-1 суммой коммита (41 байт с переводом строки). Создание ветки занимает доли секунды, в отличие от других систем контроля версий (например, Subversion), где ветвление требует копирования файлов и может занимать минуты. Указатели на родительские коммиты упрощают слияние веток.

Советы по ветвлению

Для одновременного создания и переключения на новую ветку используйте:

Linux/Windows

git checkout -b new-branch

Начиная с Git 2.23, можно использовать git switch:

  • Переключение на ветку: git switch testing
  • Создание и переключение: git switch -c new-branch
  • Возврат к предыдущей ветке: git switch -

Заключение

Вы узнали, как Git хранит данные в виде снимков, как работают ветки и указатель HEAD, а также как создавать, переключать и визуализировать ветки. Эти знания позволяют эффективно управлять разветвлённой историей.

Отзывы

Оставить отзыв

Ваша эл. почта не будет опубликована