Удаленные ветки

Удаленные ветки — это ссылки (указатели), которые находятся в ваших удаленных репозиториях, включая ветки, теги и так далее. Для получения удаленных веток и дополнительной информации используются ветки удаленного отслеживания.

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

Ветки удаленного отслеживания выглядят как <имя удаленного репозитория>/<имя ветки>. Например, если вы хотите посмотреть, как выглядела ветка main на сервере origin во время последнего соединения с ним, проверьте ветку origin/main. Если вы с партнером работали над одной проблемой, и он выложил ветку issue-53, у вас может быть своя локальная ветка issue-53. Но та ветка на сервере будет представлена у вас веткой origin/issue-53. Все это, возможно, сбивает с толку, поэтому рассмотрите пример.

Удаленные ветки

Скажем, у вас в сети есть свой Git-сервер. Если вы с него что-то склонируете (Git: Клонировать (Git: Clone)), Git автоматически назовет его origin, заберет оттуда все данные, создаст указатель на то, на что там указывает ветка main, и назовет его локально origin/main.

Git также сделает вам вашу собственную локальную ветку main, которая будет начинаться там же, где и ветка main в origin, так что вам будет с чем работать.

Совет: origin это не специальное название. Подобно тому, как название ветки main не имеет какого-либо специального значения в Git, название origin это тоже просто название. Исходная ветка репозитория называется main по единственной причине, потому, что это название широко используется. Также и origin, это название по умолчанию для удаленной ветки после клонирования. Если вы хотите назвать удаленный репозиторий narnia, вы можете переименовать его, и ваша ветка удаленного отслеживания по умолчанию будет называться narnia/main.

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

Если вы сделаете что-то в своей локальной ветке main, а тем временем кто-то, например, Василий, отправит изменения в удаленный репозиторий и обновит там ветку main, то ваши истории продолжатся по-разному. До тех пор, пока вы не свяжетесь с сервером origin, ваш указатель origin/main не будет сдвигаться.

Чтобы получить с сервера актуальную историю коммитов, нажмите Принесение (Fetch) в дополнительном меню репозитория. Эта команда ищет, какому репозиторию соответствует origin, извлекает оттуда все данные, которых у вас еще нет. Затем она обновляет ваш локальный репозиторий и сдвигает указатель origin/main на новую позицию.

Чтобы продемонстрировать то, как будут выглядеть удаленные ветки в ситуации с несколькими удаленными серверами, предположим, что у вас есть еще один внутренний Git-сервер, который используется для разработки только одной из ваших команд разработчиков.

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

Visual Studio Code сразу получит указатель на основную ветку этого репозитория teamone/main.

Так как в данный момент на этом удаленном сервере teamone есть только часть данных, которые есть на сервере origin, Git не получает никаких данных, но выставляет удаленную ветку с именем teamone/main, которая указывает на тот же коммит, что и ветка main на сервере teamone.

Возможная проблема: Если у вас в истории репозитория не отображаются ветки teamone/main или origin/main, откройте фильтр веток и выберите те, которые вы хотите видеть.

Отправить изменения

Когда вы хотите поделиться веткой с окружающими, вам необходимо отправить ее на удаленный сервер Отправка (Push), на котором у вас есть права на запись. Ваши локальные ветки автоматически не синхронизируются с удаленными серверами, вам нужно явно отправить те ветки, которыми вы хотите поделиться. Таким образом, вы можете использовать свои личные ветки для работы, которую вы не хотите показывать, и отправлять только те тематические ветки, над которыми вы хотите работать с кем-то совместно.

Например, у вас есть ветка serverfix, над которой вы хотите работать с коллегой Василием.

Вы можете отправить свою ветку в удаленный репозиторий. Нажмите Отправка (Push) в дополнительно меню репозитория. Visual Studio Code сообщит, что ветка пока еще не опубликована и предложит опубликовать ее.

Нажмите ОК.

В результате история изменений в локальном и в удаленном репозиториях будет выглядеть следующим образом.

Примечание: Вы можете отправлять локальную ветку в удаленный репозиторий под другим именем. Для этого можно воспользоваться командной строкой. Если вы не хотите, чтобы на удаленном сервере ветка называлась serverfix, то выполните команду git push origin serverfix:awesomebranch, которая отправит локальную ветку serverfix в ветку awesomebranch удаленного репозитория.
> git push origin serverfix:awesomebranch
Total 0 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)
remote: 
remote: Create a pull request for 'awesomebranch' on GitHub by visiting:
remote:      https://github.com/1C-EDT-Developer/coldevex/pull/new/awesomebranch
remote: 
To https://github.com/1C-EDT-Developer/coldevex
 * [new branch]      serverfix -> awesomebranch

В следующий раз, когда коллега Василий будет получать обновления с сервера, он получит ссылку на то, на что указывает serverfix на сервере, как удаленную ветку origin/serverfix.

Важно отметить, что когда при получении данных у вас появляются новые ветки удаленного отслеживания, вы не получаете автоматически для них локальных редактируемых копий. Другими словами, в вашем случае Василий не получит новую локальную ветку serverfix. Он получит только указатель origin/serverfix, который он не может менять.

Чтобы влить ваши наработки в свою текущую рабочую ветку, Василий может выполнить Ветвь > Объединить... (Branch > Merge...), и выбрать ветку origin/serverfix.

В этом случае его текущая ветка примет следующий вид.

Если же Василию нужна своя собственная, отдельная ветка serverfix, над которой он сможет работать, то он может создать ее на основе удаленной ветки. Для этого достаточно просто переключиться на ветку origin/serverfix и Visual Studio Code автоматически создаст для нее локальную ветку serverfix.

Теперь Василий может работать в локальной ветке serverfix. Она начинается там, где и origin/serverfix.

Отслеживать ветки

Получение ветки из удаленного репозитория автоматически создает то, что называется веткой удаленного отслеживания (или, иногда, upstream ветка). Ветки удаленного отслеживания это локальные ветки, которые напрямую связаны с удаленной веткой. Вы можете влить ветку удаленного отслеживания в какую-нибудь свою ветку, потому что Git уже знает, с какого сервера получить все удаленные ссылки.

При клонировании репозитория, как правило, автоматически создается ветка main, которая отслеживает origin/main. Однако вы можете настроить отслеживание и других веток, допустим, если вы хотите, чтобы одни ветки отслеживались с другого удаленного репозитория или не хотите отслеживать ветку main.

Если вы хотите создать локальную ветку с именем, отличным от имени удаленной ветки, используйте командную строку и команду git checkout. Например, вместо serverfix ветка будет называться у вас andrewsbranch.

> git checkout -b andrewsbranch origin/serverfix
branch 'andrewsbranch' set up to track 'origin/serverfix'.
Switched to a new branch 'andrewsbranch'

Теперь ваша локальная ветка andrewsbranch будет автоматически получать изменения из origin/serverfix.

Если у вас уже есть локальная ветка и вы хотите настроить ее на слежение за удаленной веткой, которую вы только что получили, или хотите изменить используемую upstream-ветку, то воспользуйтесь параметрами -u или --set-upstream-to для команды git branch, чтобы явно установить новое значение.

> git branch -u origin/awesomebranch
branch 'serverfix' set up to track 'origin/awesomebranch'.

Теперь ваша локальная ветка serverfix будет автоматически получать изменения из origin/awesomebranch.

Если вы хотите посмотреть как у вас настроены ветки слежения, воспользуйтесь параметром -vv для команды git branch. Это выведет список локальных веток и дополнительную информацию о том, какая из веток отслеживается, отстает, опережает или все сразу относительно отслеживаемой.

> git branch -vv
* andrewsbranch 2dd4021 [origin/serverfix: ahead 1, behind 2] bug-32
  main          38662af [origin/main] второй коммит

Итак, здесь вы видите, что ваша ветка andrewsbranch следит за origin/serverfix, опережает ее на одно изменение и отстает на два. Это значит, что есть один локальный коммит, который еще не отправлен на сервер, и есть два коммита на сервере, которые пока еще не получены.

Также вы видите, что ветка main отслеживает ветку origin/main и находится в актуальном состоянии.

Эту же информацию о состоянии текущей ветки вы можете увидеть и в графическом интерфейсе Visual Studio Code: в строке репозитория, на кнопке Синхронизировать изменения / Sync Changes и в строке состояния.

Важно отметить, что эти цифры описывают состояние на момент последнего получения данных с каждого из удаленных серверов. Команда git branch -vv не обращается к серверам, а лишь говорит вам о том, какая информация с этих серверов сохранена в локальном кеше. Если вы хотите иметь актуальную информацию об этих числах, вам необходимо получить данные со всех ваших удаленных серверов перед запуском команды.

В командной строке это можно сделать командой git fetch --all. В графическом интерфейсе Visual Studio Code для этого нужно нажать Вытягивание, отправка > Забрать из всех удаленных репозиториев (Pull, Push > Fetch From All Remotes).

Получить изменения

Команда Принесение (Fetch) загрузит из удаленного репозитория все изменения, которых у вас еще нет, но пока не будет изменять ваш рабочий каталог. Эта команда просто получает данные для вас, и позволяет вам самостоятельно сделать слияние.

Тем не менее, существует команда Вытягивание (Pull), которая является по существу командой Принесение (Fetch), непосредственно за которой следует команда Ветвь > Объединить... (Branch > Merge...), в большинстве случаев. Если у вас есть отслеживаемая ветка, как показано в предыдущем разделе, Visual Studio Code увидит, что репозиторий и удаленная ветка отслеживаются, получит изменения из удаленного репозитория, и затем попытается влить их в текущую ветку. Если в процессе сравнения не будет конфликтов, Visual Studio Code автоматически создаст коммит слияния.

Удалить ветку на удаленном сервере

Скажем, вы и ваш коллега Василий закончили с нововведением в ветке serverfix и слили его в ветку main на удаленном сервере (или в какую-то другую ветку, где хранится стабильный код).

Тогда вы можете удалить ветку serverfix на удаленном сервере используя параметр --delete для команды git push.

> git push origin --delete serverfix
To https://github.com/1C-EDT-Developer/coldevex
 - [deleted]         serverfix   

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

По материалам книги Pro Git (авторы Scott Chacon и Ben Straub, издательство Apress). Книга распространяется по лицензии Creative Commons Attribution Non Commercial Share Alike 3.0 license.