Программирование и IT
git branch
Ветка в git — это подвижный указатель на коммит, а не копия файлов. Поэтому завести её ничего не стоит, а команда git branch отвечает за список веток, их создание, переименование и удаление.
В этой статье
Ветка — это указатель#
Внутри репозитория ветка хранится как строчка с хешем коммита. Когда ты
делаешь новый коммит, указатель текущей ветки сдвигается на него — и
только он. Отдельный указатель HEAD помнит, на какой ветке ты сейчас
находишься.
Из этого следует всё остальное. Создание ветки — мгновенная операция,
сколько бы файлов ни было в проекте. Десять веток не занимают в десять раз
больше места. А удаление ветки не удаляет коммиты: исчезает только имя, сами
коммиты остаются, пока на них кто-то ссылается.
Посмотреть, что есть#
feature/login
* main
hotfix-404
Звёздочка отмечает текущую ветку. Полезные варианты вывода:
| Команда | Что показывает |
|---|---|
git branch -v |
последний коммит каждой ветки одной строкой |
git branch -vv |
то же плюс связанная ветка на сервере |
git branch -a |
и локальные, и серверные ветки |
git branch -r |
только серверные (origin/…) |
git branch --show-current |
одно имя — удобно в скриптах |
git branch --merged |
ветки, уже влитые в текущую: кандидаты на удаление |
Создать, переключиться, удалить#
Ветка заведена, но ты остался там, где были. Обычно нужно сразу перейти:
Switched to a new branch 'feature/export'
Команды switch и restore появились в git 2.23, чтобы разделить работу
старого checkout: тот умел и менять ветки, и восстанавливать файлы, из-за
чего его легко было применить не туда. Старый вариант git checkout -b feature/export работает и сейчас.
Удаление:
Deleted branch feature/export (was 9d31c07).
Строчный -d откажется удалять ветку, чья работа никуда не влита, —
error: the branch 'feature/export' is not fully merged. Это защита, а не
поломка: убедись, что коммиты действительно не нужны, и повтори с
заглавной -D. Ветку на сервере этим не тронуть, её удаляют отправкой —
см. git push.
Отсоединённая HEAD#
Если переключиться не на ветку, а на конкретный коммит или тег, git
напишет:
Note: switching to '4f1c2ab'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them...
Ничего страшного не случилось: ты просто смотришь на старое состояние
проекта, и HEAD указывает на коммит напрямую, без ветки. Опасность одна —
коммиты, сделанные в таком состоянии, не принадлежат ни одной ветке, и
после переключения на них не останется имени.
Выход зависит от того, что ты успел сделать. Ничего не коммитили —
вернись на прежнюю ветку:
Коммиты есть и они нужны — дай им имя прямо на месте:
Уже ушли, а коммиты остались без имени — найди их хеш в git reflog и
создай ветку от него: git branch spasenie 3c9f011.
Переименование и порядок в списке#
Без первого имени переименовывается текущая ветка — так часто чинят
master на main в старом репозитории. После переименования ветка на
сервере остаётся под прежним именем, её придётся отправить заново и удалить
старую.
Раз в пару недель полезно чистить список: git branch --merged покажет
влитые ветки, git fetch --prune уберёт из локального списка те серверные
ветки, которых на сервере уже нет. Названия лучше держать говорящими —
feature/export-csv, fix/login-500, — тогда список веток читается как
перечень дел, а не как набор букв. Остальные ежедневные команды собраны в
шпаргалке по командам git.
План по этапам
- Проверить, где ты сейчасgit status или git branch --show-current перед любым переключением.
- Завести ветку от нужного местаgit switch -c имя; при необходимости указать точку старта: git switch -c имя main.
- Работать и коммититьКоммиты сдвигают указатель только этой ветки, main остаётся на месте.
- Влить работуВернуться на main и слить ветку; после слияния git branch --merged её покажет.
- Удалить отработавшее имяgit branch -d имя локально и git push origin --delete имя на сервере.
Начать изучать эту тему у себя
План ляжет в твой репозиторий: отмечай этапы, веди конспект — история изменений покажет, как ты продвинулся.
Проверь себя
1.Какая команда создаст ветку feature и сразу переключится на неё?
2.Git сообщил «You are in 'detached HEAD' state», а ты успел сделать коммиты. Что их сохранит?
3.Какая команда покажет ветки, уже влитые в текущую?
Источники
-
Pro Git, книга на русскомГлава «Ветвление в Git» с рисунками указателейбесплатно
-
Справка git branchКлючи списка, создания и удалениябесплатно
-
Справка git switchСовременная команда переключения ветокбесплатно
Было полезно?