Программирование и IT

git branch

Ветка в git — это подвижный указатель на коммит, а не копия файлов. Поэтому завести её ничего не стоит, а команда git branch отвечает за список веток, их создание, переименование и удаление.

Обновлено
В этой статье

Ветка — это указатель#

Внутри репозитория ветка хранится как строчка с хешем коммита. Когда ты
делаешь новый коммит, указатель текущей ветки сдвигается на него — и
только он. Отдельный указатель HEAD помнит, на какой ветке ты сейчас
находишься.

Из этого следует всё остальное. Создание ветки — мгновенная операция,
сколько бы файлов ни было в проекте. Десять веток не занимают в десять раз
больше места. А удаление ветки не удаляет коммиты: исчезает только имя, сами
коммиты остаются, пока на них кто-то ссылается.

Посмотреть, что есть#

git branch
  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 ветки, уже влитые в текущую: кандидаты на удаление

Создать, переключиться, удалить#

git branch feature/export

Ветка заведена, но ты остался там, где были. Обычно нужно сразу перейти:

git switch -c feature/export
Switched to a new branch 'feature/export'

Команды switch и restore появились в git 2.23, чтобы разделить работу
старого checkout: тот умел и менять ветки, и восстанавливать файлы, из-за
чего его легко было применить не туда. Старый вариант git checkout -b feature/export работает и сейчас.

Удаление:

git branch -d 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 switch -

Коммиты есть и они нужны — дай им имя прямо на месте:

git switch -c experiment-sort

Уже ушли, а коммиты остались без имени — найди их хеш в git reflog и
создай ветку от него: git branch spasenie 3c9f011.

Переименование и порядок в списке#

git branch -m staraya novaya

Без первого имени переименовывается текущая ветка — так часто чинят
master на main в старом репозитории. После переименования ветка на
сервере остаётся под прежним именем, её придётся отправить заново и удалить
старую.

Раз в пару недель полезно чистить список: git branch --merged покажет
влитые ветки, git fetch --prune уберёт из локального списка те серверные
ветки, которых на сервере уже нет. Названия лучше держать говорящими —
feature/export-csv, fix/login-500, — тогда список веток читается как
перечень дел, а не как набор букв. Остальные ежедневные команды собраны в
шпаргалке по командам git.

План по этапам

  1. Проверить, где ты сейчасgit status или git branch --show-current перед любым переключением.
  2. Завести ветку от нужного местаgit switch -c имя; при необходимости указать точку старта: git switch -c имя main.
  3. Работать и коммититьКоммиты сдвигают указатель только этой ветки, main остаётся на месте.
  4. Влить работуВернуться на main и слить ветку; после слияния git branch --merged её покажет.
  5. Удалить отработавшее имяgit branch -d имя локально и git push origin --delete имя на сервере.

Начать изучать эту тему у себя

План ляжет в твой репозиторий: отмечай этапы, веди конспект — история изменений покажет, как ты продвинулся.

Начать план

Проверь себя

1.Какая команда создаст ветку feature и сразу переключится на неё?

2.Git сообщил «You are in 'detached HEAD' state», а ты успел сделать коммиты. Что их сохранит?

3.Какая команда покажет ветки, уже влитые в текущую?

Источники

Было полезно?

Ещё темы

Программирование и IT Как создать репозиторий с нуля Репозиторий — это папка проекта плюс скрытая папка `.git`, в которой хранится вся история. Создаётся одной командой, но между ней и первым осмысленным коммитом есть несколько шагов, которые потом трудно переделать: имя ветки, список игнорируемых файлов, привязка к серверу. Программирование и IT git checkout Исторически `git checkout` делает сразу несколько несвязанных вещей: переводит рабочую копию на другую ветку, создаёт ветку, достаёт отдельный файл из коммита. Из-за этой перегруженности в git 2.23 появились две отдельные команды — `switch` и `restore`. Разберём обе стороны: старый способ и современную замену. Программирование и IT Python: классы Класс описывает, из каких данных состоит объект и что он умеет делать. Конструктор `__init__` заполняет новый объект, `self` — ссылка на него самого. Ниже — минимальный рабочий класс, разница между атрибутом класса и атрибутом экземпляра и способы сделать код короче. Программирование и IT Python: строки Строка в Python — неизменяемая последовательность символов. Из этого следуют почти все её особенности: методы не меняют строку, а возвращают новую, а быстрая сборка текста идёт через join, а не через сложение в цикле. Ниже — рабочий минимум с примерами и выводом. Программирование и IT Python: списки Список — изменяемый упорядоченный набор значений произвольных типов. Он же главный источник неожиданностей у начинающих: присваивание не копирует список, sort ничего не возвращает, а удаление элементов прямо в цикле пропускает половину. Разберём по порядку. Программирование и IT Python: словари Словарь хранит пары «ключ — значение» и находит значение по ключу за постоянное время независимо от размера. Это рабочая лошадка для подсчётов, группировок и настроек. Разберём создание, безопасный доступ, перебор и места, где словарь ведёт себя не так, как ожидают.

Ещё сценарии