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

3222

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

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

  • 22
    Как отмечено ниже, для существующей ветки вы можете использовать git push -u origin branch-name .
  • 1
    Если локальная ветвь является текущей ветвью, а локальная ветвь еще не отслеживает удаленный, git pull часто будет предоставлять полезные сообщения о соответствующей команде для установки информации отслеживания.
Показать ещё 5 комментариев
Теги:
git-branch
branch

19 ответов

3722
Лучший ответ

Учитывая ветку 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' все время?

  • 115
    Является ли «upstream» названием пульта? то есть, что большинство назвало бы "происхождение" по умолчанию?
  • 157
    @ Андрей: Да. git branch --set-upstream master origin/master будет эквивалентно тому, что автоматически делается при первоначальном клонировании репозитория.
Показать ещё 23 комментария
211

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

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

git remote add origin ssh://...

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

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

И нажмите:

git push origin master
  • 0
    это действительно требуется пульт и ветка в пуш? Я имею в виду, вам это нужно, только если ваша проверенная ветвь не та, которую вы хотите нажать, верно?
  • 5
    Да, но из памяти вам может потребоваться быть явным для первого нажатия. Можно легко проверить конечно ... :)
Показать ещё 3 комментария
148

Я делаю это как побочный эффект нажатия с опцией -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] был введен с более разумным порядком аргументов.

& hellip;

Было соблазнительно сказать 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
    Это гораздо лучшее решение ИМО
  • 0
    --set-upstream-to=... это как раз то, что я искал.
53

Вы можете найти инструмент 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
  • 4
    это grb стандартной команды? Доступен в каком пакете?
  • 3
    GRB - это рубиновый драгоценный камень, к которому можно получить доступ, как описано на их github.
Показать ещё 2 комментария
47

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

git remote add upstream <remote-url>
git fetch upstream
git branch -f --track qa upstream/qa
# OR:
git branch --set-upstream qa upstream/qa
  • 0
    Локальная ветка уже отслеживала ветку, поэтому мы можем предположить, что удаленное хранилище уже было добавлено.
  • 0
    Dopplerganger: см. Комментарий Йоахима к принятому ответу. В любом случае предположения легко различаются - это то, что делает вещи такими интересными;)
42

Я считаю, что еще в 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).

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

git push origin $BRANCH

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

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

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

Изображение 7470

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

Изображение 7471

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

git checkout branchName

пример:

Изображение 7472

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

git branch --set-upstream-to nameOfRemoteBranch

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

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

Изображение 7473

  • 0
    Это сработало. Спасибо
  • 1
    В основном легкий и простой ответ.
23

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

git config push.default tracking

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

  • 1
    Это может быть удобно. Однако можно заметить, что согласно странице справочника git-config(1) , tracking является устаревшим синонимом upstream .
22

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

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

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

16

В очень короткие

git branch --set-upstream yourLocalBranchName origin/develop

Это приведет к тому, что ваш yourLocalBranchName будет отслеживать удаленную ветвь с именем develop.

  • 1
    @Quincy Проверьте ответ Грега - используйте вместо него git push -u origin branch (или --set-upstream-to )
  • 0
    @MadNik, в чем разница между --set-upstream и --track ? Я не совсем понимаю, почему я должен использовать один над другим.
14

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

grb track foo upstream

Это приведет к тому, что Git сделает foo дорожку upstream/foo.

8

Используйте опцию '--track'

  • После git pull:

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

  • Или же:

    git fetch && git checkout <branch-name>

8

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

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

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

$ 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)

Но, конечно, все еще нет локальной ветки:

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

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

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

Так просто!


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

$ git clone [email protected]:user/repo.git
$ git checkout develop
  • 1
    Отличный пример моего идентичного варианта использования. Несмотря на отсутствие признаков локальной ветки «разработка», когда я выбрал ветку «разработка», эта ветвь появляется и волшебным образом настроена для отслеживания удаленной ветви «разработка» от источника. Я ценю пошаговый пример и объяснение!
6

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

 git checkout --track -b example origin/example 
Для уже созданного ветки для создания связи между удаленным, а затем из этой ветки используйте следующую команду

 git branch -u origin/remote-branch-name
5

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

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

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

$ git branch --set-upstream-to=origin/branch-name branch-name
  • 0
    Вы поменяли местами «имя-ветви» и «имя-источника-ветви» в командной строке. Вверх по течению идет раньше местного.
  • 0
    @ maharvey67 ты прав, спасибо. Отредактировал ответ.
4

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

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

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

Локальное отслеживание ведущего устройства в начало/мастер

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

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

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

git config --global push.default upstream

  • 0
    Вы не оставили это напрасно. Благодарю.
4

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

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

Как только это было сделано, я мог бы использовать 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 
-2

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню