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

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

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

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

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

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

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

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

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

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

Для синхронизации вашей в панели Навигатор нажмите Групповая разработка > Получить из origin в контекстном меню проекта. Эта команда ищет, какому репозиторию соответствует origin, извлекает оттуда все данные, которых у вас еще нет.

Затем она обновляет ваш локальный репозиторий и сдвигает указатель origin/master на новую позицию.

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

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

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

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

Отправка изменений

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

Если у вас есть ветка serverfix, над которой вы хотите работать с кем-то еще, вы можете отправить ее в удаленный репозиторий. В панели Навигатор нажмите Групповая разработка > Отправить ветку 'serverfix'.... В качестве удаленного репозитория выберите origin.

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

Вы можете отправлять локальную ветку в удаленный репозиторий под другим именем. Если вы не хотите, чтобы в удаленном репозитории эта ветка называлась serverfix, то в предыдущем диалоге вы можете дать ей другое имя, например, awesomebranch. Так ваша локальная ветка serverfix отправится в ветку awesomebranch удаленного репозитория.

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

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

Чтобы влить эти наработки в свою текущую рабочую ветку, он может выполнить Групповая разработка > Слить... > origin/serverfix.

Если вашему соавтору нужна своя собственная ветка serverfix, над которой он сможет работать, то он может создать ее на основе удаленной ветки командой Групповая разработка > Переключить на > Другое... > origin/serverfix (или контекстной командой Извлечь на этой ветке в панели История).

Чтобы создать новую ветку он нажмет Новая ветка.... После этого 1C:EDT предложит вашему соавтору задать имя локальной ветки и настроить параметры отслеживания. Он решит ничего не менять, и нажмет Готово.

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

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

Отслеживание веток

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

При клонировании репозитория, как правило, автоматически создается ветка master, которая отслеживает origin/master. Однако вы можете настроить отслеживание и других веток, допустим, если вы хотите, чтобы одни ветки отслеживались с другого удаленного репозитория или не хотите отслеживать ветку master. Простой пример, как это сделать, вы увидели только что: Групповая разработка > Переключить на > origin/serverfix. В том же примере вы узнали, что можно настроить локальную ветку с именем, отличным от имени удаленной ветки.

Если у вас уже есть локальная ветка, и вы хотите настроить ее на удаленную ветку, которую вы только получили, или хотите изменить upstream-ветку, которую вы отслеживаете, вы можете перейти в перспективу Git и в панели Репозитории Git выполнить на этой ветке контекстную команду Настроить ветку....

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

Если вы хотите посмотреть, какие отслеживаемые ветки у вас установлены, вы можете на одной из локальных веток выполнить Показать в > Свойства, а затем пробежать курсором по локальным веткам. В панели Свойства вы увидите информацию об удаленном репозитории и об отслеживаемой ветке.

Для текущей ветки, на которую вы переключились, в панели Навигатор отображается информация о том, опережает ли она удаленную ветку, отстает от нее или равняется ей. Если локальная ветка равна удаленной, в корне проекта не будет стрелок «вверх» и «вниз».

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

Если есть стрелка вниз, значит, локальная ветка отстает от удаленного хранилища на указанное количество коммитов. То есть в удаленном репозитории есть коммиты, которые вы еще не влили в свою ветку.

И, наконец, возможна ситуация, когда есть обе стрелки.

В данном случае она означает, что наша ветка newbranch опережает на два коммита и отстает на один. Это значит, что есть один коммит на сервере, который вы еще не влили, и два локальных коммита, которые вы еще не отправили.

Важно отметить, что эти цифры это информация из удаленного хранилища, которая последний раз была получена при выполнении команды Получить из origin (или Получить из...). 1C:EDT самостоятельно не отслеживает удаленные репозитории, она только говорит вам о том, что в кеше есть локальная информация из удаленных репозиториев. Если вы хотите знать актуальное состояние опережающих и отстающих коммитов, вам необходимо получить изменения (Получить из origin или Получить из...).

Получение изменений

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

Тем не менее, существует команда Групповая разработка > Получить и слить, которая является по существу командой Групповая разработка > Получить из origin, непосредственно за которой следует команда Групповая разработка > Слить..., в большинстве случаев. Если у вас есть отслеживаемая ветка, как показано в предыдущем разделе, либо она явно установлена, или она создана в результате команд (Клонировать репозиторий Git) или Извлечь, то 1C:EDT увидит, что репозиторий и удаленная ветка отслеживаются, получит изменения из удаленного репозитория, и затем попытается влить их в текущую ветку. Если в процессе сравнения не будет конфликтов, 1C:EDT автоматически создаст коммит слияния.

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