Сделать существующую ветку Git отслеживающей удаленную ветку?


3536

Я знаю, как создать новую ветку, которая отслеживает удаленные ветви, но как мне сделать существующую ветку, отслеживающую удаленную ветку?

Я знаю, что могу просто отредактировать .git/configфайл, но, похоже, должен быть более простой способ.


26
Как отмечено ниже, для существующей ветки вы можете использовать git push -u origin branch-name.
Загс

3
Если локальная ветвь является текущей ветвью, а локальная ветвь еще не отслеживает удаленный, git pullчасто будут
появляться

57
Это раздражает, когда кто-то изучает git, когда ему показывают ссылку на документацию git. Эта документация написана для людей, которые уже знают, что они делают с git.
Фелипе Альварес

9
начиная с Git 2.10, вы должны сначала оформить заказ в намеченном локальном филиале, а затем сделать этоgit branch --set-upstream-to origin/<branch>
Махди

2
--set-upstreamвыдает ошибку: fatal: the '--set-upstream' option is no longer supported. Please use '--track' or '--set-upstream-to' instead.так git branch --set-upstream-to origin/<branch name>работает текущая команда.
Супер Джейд

Ответы:


4270

Учитывая ветку fooи пульт upstream:

Начиная с Git 1.8.0:

git branch -u upstream/foo

Или, если локальная ветвь fooне является текущей ветвью:

git branch -u upstream/foo foo

Или, если вам нравится вводить более длинные команды, они эквивалентны двум приведенным выше:

git branch --set-upstream-to=upstream/foo

git branch --set-upstream-to=upstream/foo foo

Начиная с Git 1.7.0:

git branch --set-upstream foo upstream/foo

Ноты:

  • Все вышеперечисленные команды заставят локальную ветвь fooотслеживать удаленную ветку fooс удаленной upstream.
  • Старый (1.7.x) синтаксис не рекомендуется в пользу нового (1.8+) синтаксиса. Новый синтаксис должен быть более интуитивным и более простым для запоминания.
  • Определение восходящей ветви не удастся при запуске с вновь созданными удаленными, которые еще не были выбраны. В этом случае, запустите git fetch upstreamзаранее.

Смотрите также: Зачем мне все время делать `--set-upstream`?


124
Является ли «upstream» названием пульта? то есть, что большинство назвало бы "происхождение" по умолчанию?
Андрей Вит

172
@ Андрей: Да. git branch --set-upstream master origin/masterбудет эквивалентно тому, что происходит автоматически при первоначальном клонировании репозитория.
Дэн Молдинг

62
Примечательно, что добавление этого в ваш gitconfig - это круто: «[push] default = tracking» это сделает так, что толчки будут идти в том же месте, что и
тяги

61
Я получаю «Неустранимый: Недопустимое имя объекта:« происхождение / мастер ».»
Иоахим

84
git push -u origin foo via
Cotton

236

Вы можете сделать следующее (при условии, что вы извлечены на главном сервере и хотите отправить на удаленный главный филиал):

Настройте «пульт», если у вас его еще нет

git remote add origin ssh://...

Теперь настройте мастер, чтобы знать, чтобы отслеживать:

git config branch.master.remote origin
git config branch.master.merge refs/heads/master

И нажмите:

git push origin master

это действительно требуется пульт и ветка в пуш? Я имею в виду, вам это нужно, только если ваша проверенная ветвь не та, которую вы хотите нажать, верно?
Двойник

5
Да, но из памяти вам может потребоваться быть явным для первого нажатия. Можно легко проверить, конечно ... :)
Пол Хеддерли

+1 Это ответ для пользователей Windows, которые застряли с «предварительным просмотром» msysgit, который был до 1.8. Спасибо за это.
Джон

3
Это единственный ответ, который работал для меня. Когда я попробовал обслуживаемый ответ, чтобы установить на вход пульта дистанционного управления для существующей ветви, я получил: error: the requested upstream branch 'upstream/master' does not exist.
Стив К

4
@SteveK это скорее всего потому, что ваш апстрим называется originи нет upstream.
umläute

160

Я делаю это как побочный эффект нажатия с -uопцией, как в

$ git push -u origin branch-name

Эквивалентный длинный вариант есть --set-upstream.

Команда git-branchтакже понимает --set-upstream, но ее использование может привести к путанице. Версия 1.8.0 изменяет интерфейс.

git branch --set-upstreamустарела и может быть удалена в относительно отдаленном будущем. git branch [-u|--set-upstream-to]был введен с более разумным порядком аргументов.

...

Было заманчиво сказать git branch --set-upstream origin/master, но это говорит Git организовать локальную ветку «origin / master» для интеграции с извлеченной в настоящий момент веткой, что весьма маловероятно для того, что имел в виду пользователь. Опция устарела; используйте вместо этого новую --set-upstream-to(с короткой и сладкой -u) опцию.

Скажем, у вас есть локальная fooветвь и вы хотите, чтобы она относилась к ветке с тем же именем, что и ее восходящая ветка. Сделать это с

$ git branch foo
$ git branch --set-upstream-to=origin/foo

или просто

$ git branch --set-upstream-to=origin/foo foo

1
Это гораздо лучшее решение
Imo

--set-upstream-to=...это именно то, что я искал.
Ричард

54

Вы можете найти этот git_remote_branchинструмент полезным. Он предлагает простые команды для создания, публикации, удаления, отслеживания и переименования удаленных веток. Приятной особенностью является то, что вы можете попросить grbкоманду объяснить, какие команды git она будет выполнять.

grb explain create my_branch github
# git_remote_branch version 0.3.0

# List of operations to do to create a new remote branch and track it locally:
git push github master:refs/heads/my_branch
git fetch github
git branch --track my_branch github/my_branch
git checkout my_branch

3
grb - это рубиновый драгоценный камень, к которому можно получить доступ, как объяснено на их github
mcabrams

6
ОП задает вопрос о самом Git. Так что не вводите новый инструмент, вероятно, будет лучше.
zeekvfu

grb - псевдоним для git-rebase в моей установке macOS. Я не делал этого :)
Бен Синклер

53

Собственно для принятого ответа на работу:

git remote add upstream <remote-url>
git fetch upstream
git branch -f --track qa upstream/qa
# OR:
git branch --set-upstream qa upstream/qa

Локальная ветка уже отслеживала ветку, поэтому мы можем предположить, что удаленное хранилище уже было добавлено.
Доппельгангер

Dopplerganger: см. Комментарий Йоахима к принятому ответу. В любом случае предположения легко различаются - это то, что делает вещи такими интересными;)
Ежик

44

Я полагаю, что уже в Git 1.5.x вы можете сделать так, чтобы локальная ветка $BRANCHотслеживала удаленную ветку origin/$BRANCH, как это.

Учитывая, что $BRANCHи origin/$BRANCHсуществует, и вы еще не вышли $BRANCH(отключите, если у вас есть), выполните:

git branch -f --track $BRANCH origin/$BRANCH

Это воссоздает $BRANCHкак отслеживание ветви. В -fприжимает создание , несмотря на $BRANCHсуществующие уже. --trackнеобязателен, если используются обычные значения по умолчанию (то есть параметр git-config branch.autosetupmergeимеет значение true).

Обратите внимание, что если origin/$BRANCHего еще нет, вы можете создать его, отправив свой локальный файл $BRANCHв удаленный репозиторий с помощью:

git push origin $BRANCH

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


1
git push origin $BRANCHбыло то, что я искал.
Пользователь

После всех возможных решений, включая настройку восходящего потока, как описано выше, ничего не получалось. Все, что я хотел сделать, это вытащить 1 новый коммит в мою локальную ветку из удаленного, и я изначально не настроил отслеживание. Команда git branch -f --track $BRANCH origin/$BRANCHделает свое дело.
DemitryT

38

1- обновите ваши локальные метаданные, используя: git fetch --all

введите описание изображения здесь

2 - покажите свои удаленные и локальные ветки, используя: git branch -a , см. Следующий снимок экрана

введите описание изображения здесь

3 - переключиться на целевую ветку, которую вы хотите связать с удаленным: используя

git checkout branchName

пример :

введите описание изображения здесь

4- Свяжите вашу локальную ветку с удаленной веткой, используя:

git branch --set-upstream-to nameOfRemoteBranch

NB: nameOfRemoteBranch : скопировать из вывода шага 2 "git branch -r"

Пример использования:

введите описание изображения здесь


1
В основном легкий и простой ответ.
vibs2006

25

Убедитесь, что вы запустили:

git config push.default tracking

уметь без проблем давить


1
Это может быть удобно. Тем не менее, мы можем отметить, что, согласно git-config(1)странице руководства, trackingсиноним «устарел» upstream.
FooF

23

Редактирование .git/config, вероятно, самый простой и быстрый способ. В любом случае, это то, что делают команды Git для обработки удаленных веток.

Если вы не хотите копировать файл вручную (и это не так сложно сделать), вы всегда можете использовать его git configдля этого ... но опять же, в .git/configлюбом случае , это просто отредактирует файл.

Конечно, существуют способы автоматического отслеживания удаленной ветви при использовании git checkout(например, путем передачи --trackфлага), но эти команды работают с новыми ветками, а не с существующими.


18

Очень коротко

git branch --set-upstream yourLocalBranchName origin/develop

Это сделает вашу yourLocalBranchNameдорожку удаленной develop.


1
@Quincy Проверьте ответ Грега - используйте git push -u origin branch(или --set-upstream-to) взамен
Тобиас Кинцлер

@MadNik, в чем разница между --set-upstreamи --track? Я не совсем понимаю, почему я должен использовать один над другим.
Acumenus


12

Я использую следующую команду (предположим, что ваше локальное имя ветви - «имя-ветви-локальное», а имя удаленной ветви - «имя-ветви-удаленное»):

$ git branch --set-upstream-to=origin/branch-name-remote branch-name-local

Если и локальная, и удаленная ветви имеют одно и то же имя, просто выполните следующее:

$ git branch --set-upstream-to=origin/branch-name branch-name

Вы поменяли местами «имя-ветви» и «имя-источника-ветви» в командной строке. Вверх по течению идет раньше местного.
maharvey67

@ maharvey67 ты прав, спасибо. Отредактировал ответ.
yrazlik

Это было золото, спасибо, также потому что ни один из вариантов в пределах принятого ответа не подходит, если у вас есть косые черты в названии ветви
JBoy

8

Здесь, используя githubи git version 2.1.4, просто сделайте:

$ git clone git@github.com:user/repo.git

И пульты приходят через itelsef, даже если они не связаны локально:

$ git remote show origin

* remote origin
  Fetch URL: git@github.com:user/repo.git
  Push  URL: git@github.com:user/repo.git
  HEAD branch: master
  Remote branches:
    develop tracked         <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    master  tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

Но, конечно, до сих пор нет местного отделения

$ git branch
* master                  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

Видеть? Теперь, если вы просто оформите заказ, он будет делать магию автоматически:

$ git checkout develop
Branch develop set up to track remote branch develop from origin.
Switched to a new branch 'develop'

Так просто!


Резюме. Просто запустите эти 2 команды:

$ git clone git@github.com:user/repo.git
$ git checkout develop

1
Отличный пример моего идентичного варианта использования. Несмотря на отсутствие признаков локальной ветки «разработка», когда я выбрал ветку «разработка», эта ветвь появляется и волшебным образом настроена для отслеживания удаленной ветви «разработка» от источника. Я ценю пошаговый пример и объяснение!
ElliotPsyIT


7

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

 git checkout --track -b пример происхождение / пример 
Чтобы уже созданная ветка создала связь между удаленными и затем из этой ветки, используйте команду ниже

 git branch -u origin / remote-branch-name


5

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

Будьте осторожны с push.default .

В старых версиях git совпадение по умолчанию , что могло бы привести к очень нежелательному поведению, если у вас есть, например:

Локальное отделение "Мастер" отслеживание происхождения / мастера

Дистанционное отслеживание ветки "upstream" для upstream / master

Если вы попытаетесь выполнить «git push» в ветке «upstream», то при сопоставлении push.default git автоматически попытается объединить локальную ветку «master» в «upstream / master», что приведет к большому хаосу.

Это дает более вменяемое поведение:

git config --global push.default upstream


Вы не оставили это напрасно. Спасибо.
stefgosselin

4

В некотором роде я пытался добавить ветку удаленного отслеживания в существующую ветку, но у меня не было доступа к этому удаленному репозиторию в системе, где я хотел добавить эту ветку удаленного отслеживания (потому что я часто экспортирую копию этой ветки). репо через sneakernet в другую систему, которая имеет доступ к удаленному устройству). Я обнаружил, что не было никакого способа принудительно добавить удаленную ветвь в локальную, которая еще не была выбрана (поэтому локальная не знала, что ветвь существовала на удаленной, и я получил бы ошибку:) the requested upstream branch 'origin/remotebranchname' does not exist.

В конце концов мне удалось добавить новую, ранее неизвестную удаленную ветку (без извлечения), добавив новый заголовочный файл в .git/refs/remotes/origin/remotebranchname и затем скопировав ссылку (сглаживание было самым быстрым, хромым как было ;-) из системы с доступом к источнику репо на рабочую станцию ​​(с локальным репо, где я добавлял удаленную ветку).

Как только это было сделано, я мог бы использовать git branch --set-upstream-to=origin/remotebranchname


3

или просто:

переключитесь на ветку, если вы еще не в ней:

[za]$ git checkout branch_name

запустить

[za]$ git branch --set-upstream origin branch_name
Branch origin set up to track local branch brnach_name by rebasing.

и вы готовы:

 [za]$ git push origin branch_name

Вы можете alawys взглянуть на файл конфигурации, чтобы увидеть, что именно отслеживает, запустив:

 [za]$ git config -e

Также приятно это знать, оно показывает, какие ветви отслеживаются, а какие нет. :

  [za]$ git remote show origin 

0

Для тех, кто, как и я, просто хочет синхронизировать имя вашей локальной ветви с именем удаленной ветви, вот удобная команда:

git branch -u origin/$(git rev-parse --abbrev-ref HEAD)

0

Чтобы не вспоминать, что вам нужно делать каждый раз, когда вы получаете сообщение:

Пожалуйста, укажите, с какой ветвью вы хотите объединиться. Смотрите git-pull (1)
для деталей.
.....

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

В моем случае я почти никогда не устанавливал что-то еще, кроме origin, по умолчанию для апстрима . Также я почти всегда сохраняю одно и то же имя ветки для локальной и удаленной ветки. Так что мне подходит следующее:

#!/bin/bash
# scriptname: git-branch-set-originupstream
current_branch="$(git branch | grep -oP '(?<=^\* )(.*)$')"
upstream="origin/$current_branch"
git branch -u "$upstream"

-1

Это будет работать тоже

git branch --set-upstream-to=/< remote>/< branch> < localbranch>
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.