Git: какой удаленный по умолчанию настроен для филиала?

192

У меня есть удаленное голое хранилище hub. Я работаю только в masterветке. Последнее предложение этого сообщения об ошибке ниже заставляет меня задуматься: как мне узнать, какой «удаленный по умолчанию настроен для вашей текущей ветви» ? И как мне это установить?

[myserver]~/progs $ git remote -v
hub     ~/sitehub/progs.git/ (fetch)
hub     ~/sitehub/progs.git/ (push)

[myserver]~/progs $ git branch -r
  hub/master

[myserver]~/progs $ cat .git/HEAD
ref: refs/heads/master

[myserver]~/progs $ git pull hub
You asked to pull from the remote 'hub', but did not specify
a branch. Because this is not the default configured remote
for your current branch, you must specify a branch on the command line.
leonbloy
источник

Ответы:

230

Отследить удаленную ветку

Вы можете указать удаленный репозиторий по умолчанию для отправки и извлечения, используя опцию отслеживания git-branch. Обычно вы делаете это, указывая опцию --track при создании локальной ветки master, но, поскольку она уже существует, мы просто обновим конфигурацию вручную следующим образом:

Отредактируйте свой .git/config

[branch "master"]
  remote = origin
  merge = refs/heads/master

Теперь вы можете просто git push и git pull.

[ источник ]

scragz
источник
Разве это не было бы установлено, если бы ОП сделал git pull hub master?
Райан Бигг
@ Райан Бигг: Не автоматически, иначе вы бы все испортили.
тыкай
36
Зачем редактировать файл конфигурации, если команды git существуют именно по этой причине?
urschrei
43
git branch --set-upstream local_branch remote / remote_branch (или при нажатии, как описано ниже)
urschrei
25
@scragz: Ни за что! командный подход гарантирует, что ваш .gitconfig останется в значимом состоянии.
SMCI
260

Вы можете сделать это более просто, гарантируя, что ваш .gitconfigостается в значимом состоянии:

Использование Git версии v1.8.0 и выше

git push -u hub master при нажатии или:
git branch -u hub/master

ИЛИ

(Это установит пульт для текущей извлеченной ветви в hub/master)
git branch --set-upstream-to hub/master

ИЛИ

(Это позволит установить пульт дистанционного управления для филиала с именем branch_nameв hub/master)
git branch branch_name --set-upstream-to hub/master

Если вы используете v1.7.xили ранее

Вы должны использовать --set-upstream:
git branch --set-upstream master hub/master

urschrei
источник
3
Для тех, кто интересуется: вторая команда может быть использована для существующих ветвей
Эрик Ху
1
@ eric-hu, как подробно описано в моем ответе здесь: stackoverflow.com/questions/4878249/…
urschrei
1
Команда set-upstream[-to]меняет настроенный в данный момент пульт. Оригинальный постер спрашивал о настроенном по умолчанию пульте дистанционного управления. Конечно, это не совсем та же концепция?
Стив Питчерс
1
Каждая ветвь имеет в настоящий момент настроенный удаленный, определяющий, какая ветвь на этом удаленном соответствует локальной ветке. Сконфигурированный по умолчанию пульт ДУ определяет, какая ветвь будет перемещена или вытянута, если вы не укажете ее явно. Этот ответ только устанавливает текущий . Принятый ответ (редактирование вручную) также позволяет установить ответ по умолчанию . Кто-нибудь знает команду, которая избегает необходимости редактировать вручную?
Стив Питчерс
1
--set-upstream-toсделал те же изменения, .git/configчто и @scragz в своем ответе .
Strah
26

Ради полноты: в предыдущих ответах рассказывается, как установить ветку восходящего потока, а не как ее увидеть.

Есть несколько способов сделать это:

git branch -vvпоказывает эту информацию для всех филиалов. (отформатирован синим цветом в большинстве терминалов)

cat .git/config показывает это тоже.

Для справки:

leonbloy
источник
-1

Команда для получения эффективного push-сообщения для ветви, например, master, выглядит так:

git config branch.master.pushRemote || git config remote.pushDefault || git config branch.master.remote

Вот почему (из вывода "man git config"):

branch.name.remote [...] сообщает git fetch и git push, какой удаленный выбор из / push to [...] [для push] может быть переопределен с помощью remote.pushDefault (для всех ветвей) [и] для текущая ветка [..] далее переопределена branch.name.pushRemote [...]

По какой-то причине «man git push» говорит только о branch.name.remote (даже если он имеет наименьший приоритет из трех) + ошибочно заявляет, что если он не установлен, push по умолчанию устанавливается на origin - это не так, это просто что, когда вы клонируете репозиторий, branch.name.remote будет установлен в origin, но если вы удалите этот параметр, git push потерпит неудачу, даже если у вас все еще есть удаленный источник

darkdiatel
источник
На этот вопрос уже был дан более полезный ответ.
Остин Шефер