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

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

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

23 ответа

Решение

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

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

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

git remote add origin ssh://...

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

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

И нажмите:

git push origin master

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

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

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

Вы можете найти 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

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 "

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

Я полагаю, что уже в 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

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

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

git config push.default tracking

уметь без проблем

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

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

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

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

git branch --set-upstream yourLocalBranchName origin/develop

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

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

grb track foo upstream

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

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

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

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

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

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

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

 git branch -u origin/remote-branch-name 

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

  • После git pull:

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

  • Или же:

    git fetch && git checkout <branch-name>

Здесь, используя 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

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

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

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

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

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

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

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

git config --global push.default upstream

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

git push --set-upstream origin <local_branch_name>

В случае, если вы получили «ошибку: запрошенная вышестоящая ветвь« origin/foo »не существует» после запуска:

      git branch -u origin/foo

  1. Убедиться originесть fooответвляться.

  2. Убедитесь, что remote.origin.fetchпеременная установлена ​​в +refs/heads/*:refs/remotes/origin/*:

      $ git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'
$ git config --get remote.origin.fetch
+refs/heads/*:refs/remotes/origin/*
  1. Бежать git fetch -v. Вы должны увидеть обновление git с origin/foo:
      $ git fetch -v
From github.com:davidhcefx/test
 * [new branch]      foo             -> origin/foo
 = [up to date]      master          -> origin/master
  1. В случае успеха, git branch -avvотобразит квадратные скобки, указывающие на отслеживаемые удаленные ветки:
      $ git branch -u origin/foo
branch 'foo' set up to track 'origin/foo'.
$ git branch -avv
* foo                            92c5ada [origin/foo] Initial commit
  master                         92c5ada [origin/master] Initial commit

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

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

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

Или просто:

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

[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 

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

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

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

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

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

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

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

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

git branch --set-upstream-to=/< remote>/< branch> < localbranch>
Другие вопросы по тегам