Ветки и хирургия

Ветки, удалённые репозитории и боковая панель

Одна боковая панель — с перестановкой разделов и поиском — держит ветки, удалённые репозитории, теги, стеши, рабочие деревья и сабмодули. Любой раздел можно спрятать или переставить (Настройки → Раскладка), а поле фильтра действует на все сразу. Какие разделы и папки вы держите развёрнутыми или свёрнутыми, запоминается для каждого репозитория — и переживает перезапуск.

Боковая панель — стопка панелей, не длинный список. Открытый раздел берёт высоту, которую оставляют свёрнутые — те сидят ниже строками заголовков. Откройте несколько — они делят эту высоту поровну, каждая со своей прокруткой. Раздел с сотнями тегов прокручивается внутри своей панели, остальные заголовки остаются на месте, так что ничего, что хочется нажать, не уезжает с экрана. Откройте больше, чем влезает, и все панели сжимаются вместе до заголовка — сама боковая панель никогда не прокручивается.

Только Локальные стартует открытым в репозитории, который вы ещё не расставили; каждый другой раздел стартует как заголовок. Раздел, содержащий более 300 ссылок, всё равно открывается свёрнутым. В репозитории с тысячами никогда не удалявшихся удалённых веток иначе все они оказались бы на экране, хотя их никто не запрашивал; разверните его один раз — и выбор запомнится, как и любой другой.

Боковая панель с закреплёнными ветками, удерживаемыми наверху

Ветки

Создать, переключиться, переименовать и удалить — как локальные, так и удалённые. В строках веток видно:

  • ↑впереди / ↓позади относительно своего upstream,
  • бейджи присутствия по удалённым репозиториям (на каких remote есть эта ветка),
  • точку риска после сканирования радаром конфликтов,
  • маркер ⟳, когда удалённый репозиторий переписал историю.

Ветки с / в именах автоматически сворачиваются в раскрывающиеся папки. Префикс с одним потомком всё равно папка — release/1.2.3 это release с 1.2.3 внутри — поэтому release/1.2.4 позже не перестраивает дерево. Цепочка папок с одним потомком сжимается в один заголовок (dependabot/npm_and_yarn). У заголовков папок значок папки; у самой ссылки — ветки, удалённой или тега.

Правый клик по заголовку папки действует на всю группу: Удалить все ветки в feature (4 веток) убирает всё её содержимое после одного подтверждения, которое перечисляет ровно те ветки, что будут удалены — текущая ветка исключается. То же меню есть на папках удалённых веток, там удаление идёт с удалённого репозитория.

Выпадающий список веток на панели инструментов показывает локальные и удалённые ветки. Кликните правой кнопкой по любой ветке в этом списке, чтобы переименовать локальную ветку, скопировать её имя, открыть её в новом worktree, влить её в активную ветку или удалить. Для удалённых веток переименование недоступно, а удаление после подтверждения выполняется на их удалённом репозитории. Gitcito скрывает слияние, когда выбранная ссылка уже содержится в активной ветке, и отключает создание worktree, когда эта ветка уже извлечена.

Действия с локальной веткой в выпадающем списке панели инструментов

Действия с удалённой веткой в выпадающем списке панели инструментов

Строки выделяются группами, как файлы: клик с ⌘/Ctrl переключает строку, клик с Shift выделяет диапазон, а Shift+↑/↓ расширяет выделение от последней кликнутой строки. Правый клик по выделению открывает групповое меню — Удалить 4 веток — с подтверждением, где перечислен полный список. Те же жесты работают на удалённых ветках, тегах и стешах.

Имена веток с косой чертой, свёрнутые в дерево

Переименование ветки

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

Где Как
Боковая панель Правый клик по ветке → Переименовать…
Выпадающий список веток на панели Правый клик по ветке → Переименовать…
Граф коммитов Правый клик по метке ветки на коммите → Переименовать…
Палитра команд ⌘/Ctrl+K → Переименовать ветку (действует на текущую ветку)

Локальное переименование — это git branch -m: мгновенно и отменяется по ⌘Z; запись отмены возвращает прежнее имя. Если переименовать ветку, на которой вы находитесь, вы на ней и останетесь.

Когда ветка отслеживает удалённую, меню предлагает ещё Переименовать (вместе с удалённой)…: переименовать локально, отправить новое имя и удалить старое на сервере. Это не отменяется — старой удалённой ветки больше нет, и всем, у кого она была выбрана, придётся переключиться. На метке в графе вариант появляется, только если ветка отслеживает ровно один удалённый репозиторий; при нескольких выберите ветку в боковой панели, чтобы upstream был однозначен.

Ограничения: Gitcito не переписывает ничего, что ссылалось на старое имя — открытые pull request'ы по-прежнему указывают на ветку, к которой были созданы, а правила CI по шаблону имени перестают срабатывать. Переименование ветки, выбранной в другом worktree, завершится ошибкой, и git об этом скажет.

Пул и пуш ветки, на которой вы не стоите

Правый клик по любой локальной ветке даёт пункты Забрать и Отправить, работающие именно с этой веткой, а не с текущей, — не нужно переключаться, чтобы подтянуть три ветки. См. фетч, пул и пуш.

Закреплённые ветки

Отметьте звёздочкой ветки, к которым вы постоянно возвращаетесь: наведите на строку и нажмите ★ либо правый клик → Закрепить ветку. Они всплывают группой Закреплённые наверху раздела локальных веток, запоминаются для каждого репозитория и при этом остаются на своём обычном месте ниже.

Переключение на удалённую ветку

Двойной клик по удалённой ветке создаёт локальную, которая её отслеживает. Если локальная ветка с таким именем уже есть и разошлась, Gitcito спросит, как их примирить — ребейзом, слиянием или сбросом, — и предложит сначала сделать резервную копию ветки.

Запрос при разошедшейся ветке: ребейз, слияние или сброс, с возможностью резервной копии

Когда локальная ветка отстаёт

При переключении она перематывается (fast-forward) на вершину удалённой. Грязное рабочее дерево уходит в именованный стеш и возвращается после обновления, так что локальные правки не прерывают его.

Когда локальная ветка впереди

Если локальная ветка впереди, а на удалённой ничего нового, переключение ответило бы на запрос удалённой ветки вашей же неотправленной работой — поэтому ничего не переключается, пока вы не скажете, какую сторону имели в виду:

Выбор Что произойдёт
Переключиться на локальную Переходит на локальную ветку, коммиты остаются на месте. То, что молча делает любой другой клиент.
Сброс (soft) Возвращает ветку на вершину удалённой; изменения коммитов остаются в индексе, готовые к новому коммиту.
Сброс (mixed) То же перемещение, изменения остаются вне индекса в рабочем дереве.
Сброс (hard) Отбрасывает коммиты вместе с их изменениями.

Диалог опережающей ветки: переключиться на локальную или сбросить soft, mixed, hard

Оставьте флажок Сначала создать резервную ветку, и вершина локальной ветки сохранится как backup/<ветка>-<метка-времени> до любого перемещения — даже жёсткий сброс тогда отменяется одним переключением. Сброс также попадает в стек отмены (⌘Z), но только до закрытия репозитория; резервная ветка живёт дольше.

Ограничения: диалог сравнивает ветку только со свежеполученной отслеживаемой ссылкой, поэтому удалённый репозиторий, отказавший в fetch (нет сети, неверные учётные данные), сравнивается с последней известной вершиной. Он ничего не говорит о том, хороши ли ваши коммиты, — лишь о том, что они есть здесь и нет там.

Удалённые репозитории

Раздел «Удалённые» боковой панели — там их добавляют, правят, фетчат и удаляют. Фетч, пул или пуш в репозитории без единого открывает тот же диалог Добавить удалённый репозиторий — вставьте URL или создайте репо на хосте — вместо того чтобы ничего не делать. См. фетч, пул и пуш.

См. также: Слияние и ребейз · Рабочие деревья

Улучшить этот перевод на GitHub