Как сменить удаленную ветку отслеживания?

675

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

Но теперь, когда я это делаю git pull, он утверждает, что я в курсе. Это неправильно - он говорит мне о старой удаленной ветке, а не о новой, которая, как я знаю, имеет новые коммиты для извлечения.

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

Я могу видеть это в файле конфигурации git, но я не хочу все испортить.

[branch "master"]
    remote = oldserver
    merge = refs/heads/master
Иоахим
источник
1
Я подправил ваш заголовок - вы на самом деле пытаетесь сменить пульт, который вы отслеживаете, но все равно отслеживаете в нем то же имя ветви.
Каскабель
5
Трудно считать это дубликатом Как сделать существующую ветку Git отслеживающей удаленную ветку? , Этот вопрос не указывает, что ветвь уже отслеживает удаленную ветвь. Этот делает.
1
мне кажется, что редактирование файла конфигурации - это самый простой и безопасный способ сделать это
Стивен Лу

Ответы:

1082

Используя git v1.8.0 или новее:

git branch branch_name --set-upstream-to your_new_remote/branch_name

Или вы можете использовать -uпереключатель:

git branch branch_name -u your_new_remote/branch_name

Используя git v1.7.12 или более раннюю версию :

git branch --set-upstream branch_name your_new_remote/branch_name

urschrei
источник
2
Это было то, что я искал - изменил ветку удаленного отслеживания для данной ветки. Спасибо!
Иоахим
7
Ах, мой плохой. Я бы все еще делал это через конфиг, потому что вы можете быть уверены, что случайно не измените название ветки, но все хорошо. +1.
Каскабель
Из примечаний к выпуску 1.8.0 : «Было заманчиво сказать« git branch --set-upstream origin / master », но это говорит Git организовать локальную ветку« origin / master »для интеграции с текущей извлеченной веткой, что маловероятно, что имел в виду пользователь. Параметр устарел; вместо этого используйте новую опцию --set-upstream-to (с краткой и сладкой "-u"). "
Джаред Бек
Так чисто ;_; Я мог бы исправить маленький беспорядок, который я создал так легко! Спасибо =))
депутат Адитья
56
Если удаленная ветвь отслеживания еще не существует, но существующая удаленная ветвь отслеживания в настоящее время отслеживается, ее нельзя изменить на несуществующую новую удаленную ветвь отслеживания. Вам необходимо сначала сбросить текущую удаленную ветвь отслеживания: git branch --unset-upstream- затем она работает, как указано в этом ответе (или в следующем git push -u / --set-upstream).
Хакре
88

Для меня исправление было:

git remote set-url origin https://some_url/some_repo

Затем:

git push
critikaster
источник
3
Так говорит Гитхуб, чтобы сделать это. help.github.com/articles/changing-a-remote-s-url
fsharp
18
Это на самом деле меняет местоположение пульта, оно не меняет, какой пульт вы отслеживаете (технически) - вы все еще отслеживаете «происхождение», оно просто обновляет определение источника. В некоторых случаях это может быть плохо. Предположим, вы разветвляете jQuery и создаете новый пульт. origin - ваш форк, upstream - jQuery. Тогда предположим, что вам нужно временно отследить исходное репо вместо своего форка. Если вы использовали set-urlи забыли установить его обратно, то будущие git pushкоманды потерпят неудачу
stevendesu
42

С обновленным git (2.5.5) команда выглядит следующим образом:

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

Это обновит удаленную отслеживаемую ветку для вашей текущей локальной ветки

Ko2r
источник
3
Ударяя git branch --set-upstream-to=origin/developподнял ошибку: error: the requested upstream branch 'origin/develop' does not exist. Ранее я переименовал удаленную ветку в delelop.
Белгород
1
@belgoros git fetch --allможет быть?
Габриэль Девиллерс
25

Другой вариант иметь много контроля над тем, что происходит, это редактировать ваши конфигурации вручную:

git config --edit

или стенография

git config -e

Затем отредактируйте файл по своему желанию, сохраните и ваши изменения будут применены.

wranvaud
источник
1
Это спасло день для меня. Спасибо!
Мартын Чемберлин,
Моя проблема заключалась в том, что было два источника. (происхождение и происхождение-алгоритм). Но местный мастер отслеживал «происхождение-алгоритм». Но я хотел, чтобы он отслеживал «происхождение». Единственный способ, которым я мог изменить это, было редактирование git config.
Асвин Прасад
19

Если вы в здравом уме, редактирование файла конфигурации достаточно безопасно. Если вы хотите быть немного более параноиком, вы можете использовать команду фарфор, чтобы изменить ее:

git config branch.master.remote newserver

Конечно, если вы посмотрите на конфигурацию до и после, вы увидите, что она сделала именно то, что вы собирались сделать.

Но в вашем индивидуальном случае я бы сделал следующее:

git remote rename origin old-origin
git remote rename new-origin origin

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

Cascabel
источник
3
Я действительно сделал это, прежде чем приступить к решению этой проблемы - git был умен и перенес удаленное переименование в файл конфигурации, поэтому в вашем примере мой файл конфигурации сказал 'old-origin'.
Иоахим
Лично я думаю, что этот путь имеет больше смысла концептуально, чем принятый способ, но я думаю, что они функционально эквивалентны, правильно?
Эван Донован
1
@Jefromi: A remote renameне будет делать то, о чем просят, поскольку он меняет имя пульта как в [remote]конфигах, так и в [branch]конфигах. Так что в этом случае нужно отредактировать файл конфигурации и сделать то, что вы говорите (переименование удаленных) только в [remote]строках конфигурации.
Сумит Парик
7
git fetch origin
git checkout --track -b local_branch_name origin/branch_name

или

git fetch
git checkout -b local_branch_name origin/branch_name
Ума
источник
Для моего случая мне нужно было git fetch. Я создал новую ветку в bitbucket и хотел переключиться на нее. Git не знает об удаленных изменениях, поэтому я должен был сделать git fetchраньше git checkout feature/new-feature-branch. Надеюсь, это поможет кому-то еще.
TelamonAegisthus
6

Это самая простая команда:

git push --set-upstream <new-origin> <branch-to-track>

Например, данная команда git remote -vпроизводит что-то вроде:

origin  ssh://git@bitbucket.some.corp/~myself/projectr.git (fetch)
origin  ssh://git@bitbucket.some.corp/~myself/projectr.git (push)
team    ssh://git@bitbucket.some.corp/vbs/projectr.git (fetch)
team    ssh://git@bitbucket.some.corp/vbs/projectr.git (push)

Чтобы перейти к отслеживанию команды вместо:

git push --set-upstream team master
Andries
источник
Ветка для отслеживания необязательна, когда нет ничего неоднозначного. Я использовал ваше предложение, когда уходил с Github;) Спасибо.
gouessej
4

Вы можете удалить текущую ветку и сделать:

git branch --track local_branch remote_branch

Или поменяйте замену удаленного сервера на текущий в конфиге

RDL
источник
не работал для меня, только рабочая команда была @uma: git checkout --track -b local_branch_name origin/branch_name
Саад Бенбузид
2

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

git branch -u upstream-branch local-branch
git branch --set-upstream-to=upstream-branch local-branch

Это использование, кажется, немного отличается от ответа Уршрея, так как в его резюме это:

git branch local-branch -u upstream-branch 
git branch local-branch --set-upstream-to=upstream-branch 

Я предполагаю, что они снова изменили документацию?

Аршан Ханифар
источник
1

В последней версии Git, как 2.7.4 ,

git checkout branch_name # имя ветки, которую вы хотите изменить, отслеживая ветку

git branch --set-upstream-to=upstream/tracking_branch_name #upstream - удаленное имя

Мохидин бен Мухаммед
источник
1

Я нашел пост @critikaster полезным, за исключением того, что мне приходилось выполнять эти команды с GIT 2.21:

$ git remote set-url origin https://some_url/some_repo
$ git push --set-upstream origin master
user8128167
источник
0

самый простой способ - просто нажать на новую ветку:

git push -u происхождение ветка / имя

ArthNRick
источник