Синхронизация и много репозиториев

Фетч, пул и пуш

Пул

Три режима, выбираются из выпадающего списка: по умолчанию, только fast-forward или ребейз. Локальные изменения автоматически убираются в стеш и возвращаются вокруг пула, так что грязное дерево вас не блокирует.

Ветка, которая ничего не отслеживает

git pull — это фетч, а за ним слияние, и слиянию нужно знать, во что сливать: upstream ветки. У ветки, созданной локально или переключённой без отслеживания, его нет. Фетч при этом проходит, мимо пролетает длинный список обновлённых рефов origin/*, а затем git останавливается с "There is no tracking information for the current branch". Ничего не было получено и ничего не сломалось: у второй половины просто не было цели.

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

Она есть на удалённом Связать и получить — назначает upstream <удалённый>/<ветка> и затем выполняет тот pull, который вы просили. Отменяемо через ⌘Z — отмена снова снимает отслеживание.
Её там ещё нет Отправить ветку — обычный push, который попутно назначает upstream.

Предлагается origin, если он есть, иначе первый удалённый из списка. Какой из случаев ваш, читается из рефов отслеживания, а не из сети, — так что ответ отражает только что выполненный фетч.

Пуш

Форс-пуш всегда использует --force-with-lease — безопасный вариант, который откажется, если удалённый репозиторий сдвинулся с тех пор, как вы последний раз смотрели. Форс-пуш в защищённую ветку требует подтверждения (список — в шестерёнке настроек репозитория).

Подтверждение, которого защищённая ветка требует перед форс-пушем

Нет удалённых

Пуш, пул и фетч нуждаются в цели. Репозиторий без единого — свежий git init, клон, у которого убрали origin — раньше оставлял эти кнопки без действия или считал пустой фетч успехом. Теперь они открывают Добавить удалённый репозиторий, с предупреждением: вставьте URL или создайте репо на хосте. Добавление заканчивает начатое действие: пуш публикует текущую ветку, пул фетчит и затем делает пул, фетч только фетчит.

Фоновый автофетч молчит, когда фетчить нечего. Диалог по таймеру он не открывает.

Больше одного удалённого репозитория

Кнопка Пуш отправляет в upstream ветки. Стрелка рядом с ней дополнительно предлагает — как только у репозитория появляется больше одного remote:

Запушить в один remote Выберите один — форк, зеркало, цель деплоя
Запушить во все N удалённых По одному пушу на каждый, по порядку
Запушить все теги в git push <remote> --tags, все локальные теги разом

Те же два действия есть в строке каждого remote в боковой панели — а именно там вы обычно и находитесь, когда возникает такой вопрос.

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

Upstream ветки задаёт только первый remote в списке. У ветки один upstream, и последний remote, в который вы запушили, — не автоматически тот, за которым вы хотите её закрепить.

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

Ветки, на которых вы не стоите

git pull двигает только HEAD — поэтому большинство клиентов требует сперва переключиться на ветку. Gitcito не требует: правый клик по любой локальной ветке — на боковой панели или на её значке в графе — даёт Забрать <ветку> и Отправить <ветку>, и оба действуют именно на неё.

Забрать <ветку> Перематывает локальную ссылку к её upstream, без переключения. Рабочее дерево не трогается. Отменяется по ⌘Z — отмена возвращает ветку на прежнее место.
Отправить <ветку> Обычный пуш этой ветки, с теми же проверками защищённой ветки и секретов, что и кнопка на панели.

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

Важное ограничение: ветка, разошедшаяся с upstream, отклоняется — с сообщением об этом. Согласовать расхождение — значит сделать merge или rebase, а им нужно рабочее дерево, так что этот случай по-прежнему стоит переключения. Принудительная отправка ветки, на которой вы не стоите, предлагается, если удалённый репозиторий отклонил пуш; путь «забрать и повторить» — нет, по той же причине.

Фетч

У Получить есть своя кнопка на панели инструментов, рядом с Пул. Она получает со всех удалённых и чистит устаревшие, так что ваши рефы origin/* и все счётчики впереди/позади становятся актуальными — и не трогает ни вашу ветку, ни рабочее дерево. Это та кнопка, когда хочется посмотреть, что сделали остальные, не сдвигая собственную работу.

Есть также фоновый авто-фетч с интервалом, который вы задаёте (Настройки → Общие). Наведите курсор на кнопку «Получить» — возраст проявится под ней, 4 мин назад, янтарным, если фетч старше пятнадцати минут. Он никогда не занимает места в панели, потому что отвечает на вопрос, который задают лишь потянувшись к кнопке. Читается из FETCH_HEAD, так что git fetch, запущенный в терминале, считается наравне с запущенным здесь.

Фетч, обнаруживший переписанную историю, говорит об этом: тост называет ветку, а её строка получает маркер, открывающий что изменилось с тех пор ровно на том коммите, на который она указывала раньше.

Много репозиториев разом

  • Вкладка группы умеет делать Фетч всех / Пул всех по всему своему поддереву.
  • Центр управления делает это по всему рабочему пространству и умеет тянуть только те репозитории, которые действительно отстали.

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

Добавляйте, редактируйте, удаляйте и фетчите отдельные remote из боковой панели. Строки веток несут бейджи присутствия по каждому remote, так что видно с первого взгляда, у каких удалённых репозиториев есть копия ветки.

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

См. также: Центр управления · Хостинги и пул-реквесты

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