Сделать существующую ветку 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
Убедиться
origin
естьfoo
ответвляться.Убедитесь, что
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/*
- Бежать
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
- В случае успеха,
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>