Удалённые ветки ― это ссылки на состояние веток в ваших удалённых репозиториях. Это локальные ветки, которые нельзя перемещать; они двигаются автоматически всякий раз, когда вы осуществляете связь по сети. Удалённые ветки действуют как закладки для напоминания о том, где ветки в удалённых репозиториях находились во время последнего подключения к ним.
Они выглядят как
[имя удал. репоз.]/[ветка]
. Например, если вы хотите посмотреть, как выглядела ветка master
на сервере origin
во время последнего соединения с ним, проверьте ветку origin/master
. Если вы с партнёром работали над одной проблемой, и он выложил ветку iss53
, у вас может быть своя локальная ветка iss53
; но та ветка на сервере будет указывать на коммит в origin/iss53
.
Всё это возможно сбивает с толку, поэтому давайте рассмотрим пример. Скажем, у вас есть Git-сервер в сети на git.ourcompany.com. Если вы склонируете (clone
) с него, Git автоматически назовёт его для вас origin
, заберёт с него все данные, создаст указатель на его ветку master
и назовёт его локально origin/master
(но вы не можете его двигать). Git также сделает вам вашу собственную ветку master
, которая будет начинаться там же, где и ветка master
в origin
, так что вам будет с чем начать работать (смотри Рис. 3-22).
Рисунок 3-22. Клонирование Git-проекта даёт вам собственную ветку master
и origin/master
указывающий на ветку master
в origin
master
, а тем временем кто-то ещё отправит (push
) изменения на git.ourcompany.com и обновит там ветку master
, то ваши истории продолжатся по-разному. К тому же, до тех пор, пока вы не свяжитесь с сервером origin
, ваш указатель origin/master
не будет сдвигаться (смотри Рисунок 3-23).
Рисунок 3-23. При выполнении локальной работы и отправке кем-то изменений на удалённый сервер, каждая история продолжается по-разному
git fetch origin
. Эта команда ищет какому серверу соответствует origin
(в нашем случае это git.ourcompany.com); извлекает оттуда все данные, которых у вас ещё нет, и обновляет ваше локальное хранилище данных; сдвигает указатель origin/master
на новую позицию (смотри Рисунок 3-24).
Рисунок 3-24. Команда git fetch
обновляет ваши удалённые ссылки
git remote add
так же как было описано в Главе Основы Git. Дайте этому удалённому серверу имя teamone
, которое будет сокращением для полного URL (смотри Рисунок 3-25).
Рисунок 3-25. Добавление дополнительного удалённого сервера
git fetch teamone
, чтобы извлечь всё, что есть на сервере и нет у вас. Так как в данный момент на этом сервер есть только часть данных, которые есть на сервере origin
, Git не получает никаких данных, но выставляет удалённую ветку с именем teamone/master
, которая указывает на тот же коммит, что и ветка master
на сервере teamone
(смотри Рисунок 3-26).
Рисунок 3-26. У вас появилась локальная ссылка на ветку master
на teamone
-е
Отправка изменений
Когда вы хотите поделиться веткой с окружающими, вам необходимо отправить (push
) её на удалённый сервер, на котором у вас есть права на запись. Ваши локальные ветки автоматически не синхронизируются с удалёнными серверами — вам нужно явно отправить те ветки, которыми вы хотите поделиться. Таким образом, вы можете использовать свои личные ветки для работы, которую вы не хотите показывать, и отправлять только те тематические ветки, над которыми вы хотите работать с кем-то совместно.
Если у вас есть ветка serverfix
, над которой вы хотите работать с кем-то ещё, вы можете отправить её точно так же как вы отправляли вашу первую ветку. Выполните git push удал. сервер ветка
:
$ git push origin serverfix
Counting objects: 20, done.
Compressing objects: 100% (14/14), done.
Writing objects: 100% (15/15), 1.74 KiB, done.
Total 15 (delta 5), reused 0 (delta 0)
To git@github.com:schacon/simplegit.git
* [new branch] serverfix -> serverfix
Это в некотором роде сокращение. Git автоматически разворачивает имя ветки serverfix
до refs/heads/serverfix:refs/heads/serverfix
, что означает “возьми мою локальную ветку serverfix и обнови из неё удалённую ветку serverfix”. Мы подробно обсудим часть с refs/heads/
в Главе 9, но обычно можно её опустить. Вы можете сделать также git push origin serverfix:serverfix
, что означает то же самое — здесь говорится “возьми мой serverfix и сделай его удалённым serverfix
”. Можно использовать этот формат для отправки локальной ветки в удалённую ветку, которая называется по-другому. Если вы не хотите, чтобы ветка называлась serverfix
на удалённом сервере, то вместо предыдущей команды выполните git push origin serverfix:awesomebranch
. Так ваша локальная ветка serverfix
отправится в ветку awesomebranch удалённого проекта.
В следующий раз, когда один из ваших соавторов будет получать обновления с сервера, он получит ссылку на то, на что указывает serverfix
на сервере, как удалённую ветку origin/serverfix
:
$ git fetch origin
remote: Counting objects: 20, done.
remote: Compressing objects: 100% (14/14), done.
remote: Total 15 (delta 5), reused 0 (delta 0)
Unpacking objects: 100% (15/15), done.
From git@github.com:schacon/simplegit
* [new branch] serverfix -> origin/serverfix
Важно отметить, что когда при получении данных у вас появляются новые удалённые ветки, вы не получаете автоматически для них локальных редактируемых копий. Другими словами, в нашем случае вы не получите новую ветку serverfix
— только указатель origin/serverfix
, который вы не можете менять.
Чтобы слить эти наработки в вашу текущую рабочую ветку, можете выполнить git merge origin/serverfix
. Если вы хотите иметь собственную ветку serverfix
, над которой вы сможете работать, можете создать её на основе удалённой ветки:
$ git checkout -b serverfix origin/serverfix
Branch serverfix set up to track remote branch refs/remotes/origin/serverfix.
Switched to a new branch "serverfix"
Это даст вам локальную ветку, на которой можно работать. Она будет начинаться там, где и origin/serverfix
.
Отслеживание веток
Получение локальной ветки с помощью git checkout
из удалённой ветки автоматически создаёт то, что называется отслеживаемой веткой. Отслеживаемые ветки это локальные ветки, которые напрямую связаны с удалённой веткой. Если находясь на отслеживаемой ветке, вы наберёте git push
, Git автоматически знает на какой сервер и в какую ветку отправлять изменения. Аналогично, выполнение git pull
на одной из таких веток сначала получает все удалённые ссылки, а затем автоматически делает слияние с соответствующей удалённой веткой.
При клонировании репозитория, как правило, автоматически создаётся ветка master
, которая отслеживает origin/master
. Вот почему git push
и git pull
работают “из коробки” и не требуют других аргументов. Однако, если хотите, можете настроить другие отслеживаемые ветки — те, которые не отслеживают ветки в origin
, и те, которые не отслеживают ветку master
. Простой случай это тот пример, который вы только что видели — выполнение git checkout -b [ветка] [удал. сервер]/[ветка]
. Если вы используете Git версии 1.6.2
или более позднюю, можете также воспользоваться сокращением --track
:
$ git checkout --track origin/serverfix
Branch serverfix set up to track remote branch refs/remotes/origin/serverfix.
Switched to a new branch "serverfix"
Чтобы настроить локальную ветку с именем отличным от имени удалённой ветки, вы можете легко использовать первую версию с другим именем локальной ветки:
$ git checkout -b sf origin/serverfix
Branch sf set up to track remote branch refs/remotes/origin/serverfix.
Switched to a new branch "sf"
Теперь ваша локальная ветка sf
будет автоматически отправлять (push
) и получать (pull
) изменения из origin/serverfix
.
Удаление веток на удалённом сервере
Предположим, что вы закончили с удалённой веткой. Скажем, вы и ваши соавторы закончили с нововведением и слили его в ветку master
на вашем удалённом сервере (или какую-то другую ветку, где у вас находится стабильный код). Вы можете удалить ветку на удалённом сервере используя весьма глупый синтаксис git push [удал. сервер] :[ветка]
. Если вы хотите удалить ветку serverfix
на сервере, выполните следующее:
$ git push origin :serverfix
To git@github.com:schacon/simplegit.git
- [deleted] serverfix
Хлоп. Нет больше ветки на вашем сервере. Вам может захотеться сделать закладку на текущей странице, так как эта команда вам понадобится, а синтаксис вы, скорее всего, забудете. Можно запомнить эту команду вернувшись к синтаксису git push [удал. сервер] [лок. ветка]:[удал. ветка]
, который мы рассматривали немного раньше. Опуская часть [лок. ветка]
, вы по сути говорите “возьми ничего у меня и сделай это [удал. ветка]
”.
Pro Git