Введение
Эта статья объясняет, как работает ветвление в 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, а также как создавать, переключать и визуализировать ветки. Эти знания позволяют эффективно управлять разветвлённой историей.
Отзывы