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

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

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


person Pat Notz    schedule 06.02.2009    source источник
comment
Если локальная ветвь является текущей ветвью, а локальная ветвь еще не отслеживает удаленный, git push -u origin branch-name часто будет предоставлять полезные сообщения о соответствующей команде для установки информации отслеживания.   -  person Zags    schedule 07.03.2014
comment
Это раздражает, когда кто-то изучает git, чтобы ему показывали ссылку на документацию git. Эта документация, похоже, написана для людей, которые уже знают, что они делают с git.   -  person billrichards    schedule 07.08.2015
comment
начиная с Git 2.10 вы должны сначала оформить заказ в предполагаемую локальную ветку, а затем сделать это _1_   -  person Felipe Alvarez    schedule 18.03.2017
comment
git branch --set-upstream-to origin/<branch> выдает ошибку: _2_ поэтому _3_ - текущая команда, которая работает.   -  person Mahdi Javaheri    schedule 18.09.2017
comment
Для людей, которые получают этот вопрос SO при первом поиске --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>. Работает с _4_. _5_ предназначен для _6_, так как _7_ согласно _8_   -  person Super Jade    schedule 24.08.2018
comment
определенно разочаровывает то, что периодическая проверка ветки или запуск gitflow не связывает ветку с удаленным источником и случайным образом вызывает ошибки вместо выполнения обычных команд. Это нарушает сценарии установки или ставит в тупик новичков, которым говорят следовать этим командам, чтобы начать работу.   -  person Jeroen Wiert Pluimers    schedule 17.09.2018
comment
Отвечает ли это на ваш вопрос? Как мне отправить новую локальную ветку в удаленный репозиторий Git и отследить ее тоже?   -  person ppostma1    schedule 21.06.2019
comment
Является ли восходящий поток именем пульта дистанционного управления? то есть, что больше всего назовет происхождением по умолчанию?   -  person Henke    schedule 05.12.2020


Ответы (21)


Учитывая ветку 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 (до 1.8.0):

git branch --set-upstream foo upstream/foo

Примечания:

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

См. Также: Почему мне все время нужно выполнять `--set-upstream`?

person Dan Moulding    schedule 18.02.2010
comment
@ Андрей: Да. _1_ будет эквивалентно тому, что делается автоматически при первоначальном клонировании репозитория. - person Andrew Vit; 26.06.2010
comment
Кстати, добавить это в ваш gitconfig - это здорово: [push] default = tracking, это сделает так, что нажатия будут отправляться в то же место, откуда исходят запросы :) - person Dan Moulding; 26.06.2010
comment
Я получаю фатальный: недопустимое имя объекта: origin / master. - person jpswain; 05.12.2010
comment
На всякий случай, если кто-то не знал: git branch -a -v показывает, какие ветки у вас есть, git remote -v показывает, какие пульты у вас есть. - person joachim; 25.03.2011
comment
Йоахим: у вас есть пульт origin с мастером ветки? _1_ покажет ваши удаленные ветки. - person Ondra Žižka; 09.05.2011
comment
Йоахим: У меня такая же ошибка. В моем случае я менял серверы для удаленного происхождения, поэтому я переименовал удаленный. Тогда больше не было удаленной ветки origin / master, поэтому мне нужно было сделать это: git fetch origin git branch --set-upstream master origin / master git pull - person Matt Connolly; 25.07.2011
comment
@PaulHedderly (просто для подтверждения), эта команда буквально не делает ничего, кроме того, что делает ваш ответ? - person Cotton; 21.09.2011
comment
@joachim такая же ошибка, мне просто пришлось начать с ввода git push origin master, потому что сначала не было основной ветки в удаленном источнике. - person Alexander Bird; 08.01.2012
comment
Для справки в будущем: если вы получите фатальный результат: неоднозначное имя объекта: ‹ваше имя объекта›, добавьте перед ним _1_. Поэтому вместо _2_ сделайте _3_. - person Unfalkster; 23.01.2012
comment
@ErikHesselink Я все еще получаю неоднозначную ошибку, даже с помощью remotes / origin / master: warning: refname 'remotes / origin / master' неоднозначно. фатальный: неоднозначное имя объекта: «remotes / origin / master». - person Erik Hesselink; 27.01.2012
comment
@ J.PabloFernández: Попробуйте добавить «refs /» перед именем удаленной ветки, сделав его «refs / remotes / origin / master». - person pupeno; 12.02.2012
comment
@ErikHesselink, который не помогает: git branch --set-upstream master refs / remotes / origin / master error: Not tracking: неоднозначная информация для ref refs / remotes / origin / master - person Erik Hesselink; 13.02.2012
comment
@ErikHesselink, да ладно ... как-то у меня получилось запутанное репо. - person pupeno; 13.02.2012
comment
Также в недавнем _1_, если вы выбрали новую удаленную ветку и не имеете для нее локальной ветки, тогда _2_ с тем же именем ветки автоматически создаст ветку отслеживания. - person pupeno; 13.02.2012
comment
Чтобы отобразить свое происхождение и восходящий поток, введите git - person Eugene; 15.01.2013
comment
Я использую Git 1.8.1.2, и он дает мне: _1_ - person TachyonVortex; 18.12.2013
comment
@ChrisFrancis Git не перестает удивлять меня своими мощными и гибкими функциями, доступ к которым осуществляется с помощью загадочного, но удивительно простого синтаксиса. Иногда, когда я приезжаю сюда, мне кажется, что я в Хогвартсе изучаю новые заклинания ... - person guneysus; 20.12.2013
comment
На самом деле это работает и с git-svn, хотя вам может потребоваться немного поработать (например, обычная перебазировка git), чтобы ваша локальная ветка больше не отделялась от новой ветки svn. - person bearvarine; 26.02.2014
comment
@AndrewVit Я всегда устанавливаю свое удаленное репо (например, GitHub) на _1_, а репо, из которого я разветвлялся, как _2_. Тогда я _3_ и _4_ - person NeoSkye; 01.03.2014
comment
Это не работает правильно в git 2.8.1. Он пытается создать локальную ветку с именем upstream / foo, даже если upstream является удаленным репо. - person flying sheep; 30.12.2014
comment
1-е и 3-е решения будут работать, только если _1_ является текущей веткой в соответствии с в документы, даже в 1.8. Поскольку в вопросе не указывается, проверена ли существующая ветка, я считаю, что _2_ и _3_ следует удалить из этого ответа. - person cmcginty; 29.04.2016
comment
foo работает у меня, не пробуйте другие. - person John E; 18.02.2019
comment
Также его можно использовать как: git branch -u upstream/foo - person hukeping; 06.10.2019
comment
Почему по умолчанию git не нажимает на эту ветку? У меня есть ветка git branch -u origin/branch_name, отслеживающая _2_ удаленного. _3_ и _4_ не работают, но длинный _5_ работает. - person Taras Melnyk; 11.06.2020
comment
действительно нужен пульт и ветка в пуше? Я имею в виду, вам это нужно только в том случае, если ваша извлеченная ветка не та, которую вы хотите отправить, верно? - person Minh Nghĩa; 17.06.2020

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

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

git remote add origin ssh://...

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

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

И нажимаем:

git push origin master
person Paul Hedderly    schedule 09.03.2009
comment
Да, но по памяти вам может потребоваться явное выражение для первого нажатия. Можно, конечно, легко протестировать ... :) - person Doppelganger; 02.03.2010
comment
+1 Это ответ для пользователей Windows, которые застряли с предварительным просмотром msysgit до 1.8. Спасибо за это. - person Paul Hedderly; 19.06.2010
comment
Это единственный ответ, который у меня сработал. Когда я попробовал принятый ответ, чтобы настроить удаленный восходящий поток для существующей ветки, я получил: _1_. - person John; 16.10.2012
comment
@SteveK, скорее всего, потому, что ваш апстрим называется error: the requested upstream branch 'upstream/master' does not exist, а не _2_. - person Steve K; 14.05.2014
comment
Локальная ветка уже отслеживала ветку, поэтому мы можем предположить, что удаленное репо уже было добавлено. - person umläute; 11.08.2015

Я делаю это как побочный эффект нажатия с опцией -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 1.8.0 и выше:

$ git branch --set-upstream-to=origin/foo foo
person Greg Bacon    schedule 02.10.2012

Собственно, чтобы принятый ответ работал:

Возможно, вам пригодится инструмент git remote add upstream <remote-url> git fetch upstream git branch -f --track qa upstream/qa # OR Git version 1.8.0 and higher: git branch --set-upstream-to=upstream/qa # Gitversions lower than 1.8.0 git branch --set-upstream qa upstream/qa . Он предлагает простые команды для создания, публикации, удаления, отслеживания и переименования удаленных веток. Одна приятная особенность заключается в том, что вы можете попросить команду _2_ объяснить, какие команды git она будет выполнять.

git remote add upstream <remote-url>
git fetch upstream
git branch -f --track qa upstream/qa
# OR Git version 1.8.0 and higher:
git branch --set-upstream-to=upstream/qa
# Gitversions lower than 1.8.0
git branch --set-upstream qa upstream/qa
person Hedgehog    schedule 23.11.2010
comment
Допплергангер: См. Комментарий Иоахима к принятому ответу. В любом случае предположения легко расходятся - это то, что делает вещи такими интересными;) - person Doppelganger; 19.05.2011
comment
grb - это рубиновый драгоценный камень, к которому можно получить доступ, как описано на их github. - person Hedgehog; 14.06.2011

Я считаю, что уже в Git 1.5.x вы могли заставить локальную ветку git_remote_branch отслеживать удаленную ветку grb, как это.

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
person James Mead    schedule 06.02.2009
comment
OP задает вопрос о самом Git. Так что, наверное, лучше не вводить новый инструмент. - person mcabrams; 19.03.2013
comment
grb - это псевдоним для git-rebase в моей установке macOS. Я этого не делал :) - person zeekvfu; 18.05.2014
comment
_1_ было тем, что я искал. - person Ben Affleck; 09.03.2018

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

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

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

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

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

git push origin $BRANCH

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

person wu-lee    schedule 28.07.2010
comment
После попытки всевозможных решений, включая настройку апстрима, как описано выше, ничего не вышло. Все, что я хотел сделать, это вытащить 1 новую фиксацию в мою локальную ветку из удаленной ветки, и я изначально не настраивал отслеживание. Команда git push origin $BRANCH делает свое дело. - person User; 02.04.2013
comment
В основном легкий и простой ответ. - person DemitryT; 13.02.2014

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

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

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

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

git checkout branchName

пример :

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

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

git branch --set-upstream-to nameOfRemoteBranch

Примечание: nameOfRemoteBranch: для копирования из вывода шага 2 «git branch -r»

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

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

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

person Monsif EL AISSOUSSI    schedule 06.06.2016
comment
Это могло быть удобно. Однако можно отметить, что согласно _1_ странице руководства, _2_ является устаревшим синонимом _3_. - person vibs2006; 30.08.2017

чтобы быть в состоянии избавиться от проблем

git config push.default tracking

Редактирование

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

person romanlv    schedule 29.08.2011
comment
@Quincy Проверьте ответ Грега - используйте вместо этого git-config(1) (или tracking) - person FooF; 08.08.2012

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

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

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

person mipadi    schedule 06.02.2009

Это заставит ваш yourLocalBranchName отслеживать удаленную ветку с именем develop.

git branch --set-upstream yourLocalBranchName origin/develop

Для 1.6.x это можно сделать с помощью инструмента git_remote_branch:

person MadNik    schedule 09.10.2012
comment
@MadNik, в чем разница между git push -u origin branch и --set-upstream-to? Я не совсем понимаю, почему я должен использовать одно вместо другого. - person Tobias Kienzler; 28.05.2013
comment
Вы поменяли местами имя-ветки и источник / имя-ветки в командной строке. Восходящий поток предшествует местному. - person Acumenus; 31.03.2014

Это заставит Git сделать foo трек upstream/foo.

grb track foo upstream

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

person wik    schedule 01.06.2010

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

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

Здесь, используя

$ git branch --set-upstream-to=origin/branch-name-remote branch-name-local
и
$ git branch --set-upstream-to=origin/branch-name branch-name
, просто выполните:

$ git branch --set-upstream-to=origin/branch-name branch-name
person yrazlik    schedule 22.12.2015
comment
@ maharvey67 вы правы, спасибо. Отредактировал ответ. - person Alcamtar; 11.10.2018
comment
Это было золото, спасибо, еще потому, что ни один из вариантов в принятом ответе не подходит, если у вас есть косая черта в имени ветки - person yrazlik; 12.10.2018
comment
Отличный пример моего идентичного варианта использования. Несмотря на отсутствие признаков локальной ветки «разработка», когда я проверил ветку «разработка», эта ветка появляется и волшебным образом настраивается для отслеживания удаленной ветки «разработка» из источника. Я ценю пошаговый пример и объяснение! - person JBoy; 15.07.2019

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

$ git clone [email protected]:user/repo.git

Но, конечно же, местного филиала по-прежнему нет:

$ git remote show origin

* remote origin
  Fetch URL: [email protected]:user/repo.git
  Push  URL: [email protected]: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)

Видеть? Теперь, если вы просто проверяете develp, он автоматически творит чудеса:

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

Так просто!

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

Сводка. Просто выполните две команды:


После github:

$ git clone [email protected]:user/repo.git
$ git checkout develop
person DrBeco    schedule 29.11.2015
comment
Вы не оставили это зря. Спасибо. - person ElliotPsyIT; 27.03.2018

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

  • Используйте параметр --track

    git checkout --track <remote-branch-name>

  • Or:

    git fetch && git checkout <branch-name>

person Loukan ElKadi    schedule 02.08.2016

Остерегайтесь push.default.

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

Отслеживание "главного" местного филиала до источника / хозяина

Отслеживание удаленного ответвления "восходящего направления" до восходящего / главного

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

Это дает более разумное поведение:

git config --global push.default восходящий поток

Для git версии _1_ используйте команду:

person Tom Mettam    schedule 21.05.2016
comment

- person stefgosselin; 16.02.2017

В некотором роде я пытался добавить ветку удаленного отслеживания в существующую ветку, но не имел доступа к этому удаленному репозиторию в системе, куда я хотел бы добавить эту ветку удаленного отслеживания (потому что я часто экспортирую копию этого репо через sneakernet в другую систему, у которой есть доступ для отправки на этот удаленный компьютер). Я обнаружил, что не было возможности принудительно добавить удаленную ветку на локальном, которая еще не была извлечена (поэтому локальный не знал, что ветка существует на удаленном, и я получил бы сообщение об ошибке: 2.25.1).

git push --set-upstream origin <local_branch_name>
person tonderaimuchada    schedule 13.08.2020

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

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

или просто:

person Ville    schedule 05.10.2015

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

запустить

[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

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

 [za]$ git config -e

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

  [za]$ git remote show origin 
person z atef    schedule 07.10.2016

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

git branch -u origin/$(git rev-parse --abbrev-ref HEAD)
person Constantinos    schedule 26.02.2019

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

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

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

Это тоже сработает

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

Как указано ниже, для существующей ветки вы можете использовать

git branch --set-upstream-to=/< remote>/< branch> < localbranch>
.

git branch --set-upstream-to=/< remote>/< branch> < localbranch>
person Abhi    schedule 22.06.2016