Como alterar o controle remoto que uma filial está rastreando?

671

O centralrepositório tinha que ser configurado em um novo servidor, então eu criei um novo controle remoto no meu repositório local e fui pressionado para isso.

Mas agora, quando o faço git pull, alega que estou atualizado. Está errado - está me falando sobre o antigo ramo remoto, não o novo, que eu sei que tem novos compromissos a buscar.

Como altero minha filial local para rastrear um controle remoto diferente?

Eu posso ver isso no arquivo de configuração do git, mas não quero estragar tudo.

[branch "master"]
    remote = oldserver
    merge = refs/heads/master
joachim
fonte
1
Ajustei seu título - você está realmente tentando alterar o controle remoto que está rastreando, mas ainda acompanha o mesmo nome de filial.
Cascabel 02/02
5
É difícil considerar isso uma duplicata de Como você faz com que uma ramificação Git existente rastreie uma ramificação remota? . Essa pergunta não especifica que o ramo já está rastreando um ramo remoto. Este faz.
1
Parece-me como editar o arquivo de configuração é o mais fácil e mais segura de fazer isso
Steven Lu

Respostas:

1077

Usando o git v1.8.0 ou posterior:

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

Ou você pode usar o -uswitch:

git branch branch_name -u your_new_remote/branch_name

Usando o git v1.7.12 ou anterior:

git branch --set-upstream branch_name your_new_remote/branch_name

Urschrei
fonte
2
Era isso que eu procurava - mudou o ramo de rastreamento remoto para o ramo em questão. Obrigado!
Joachim
7
Ah, meu mal. Eu ainda faria isso via config, porque você pode ter certeza de não alterar acidentalmente o nome do ramo, mas tudo de bom. +1.
Cascabel
Nas notas de versão 1.8.0 : "Era tentador dizer" ramificação do git - origem / configuração do upstream / mestre ", mas isso diz ao Git para organizar a ramificação local" origem / mestre "para integrar-se à ramificação com check-out atualmente, que é altamente improvável o que o usuário quis dizer. A opção foi descontinuada; use a nova opção "--set-upstream-to" (com uma opção "-u" curta e agradável). "
Jared Beck
Tão limpo ;_; Eu poderia consertar a pequena bagunça que criei tão facilmente! Obrigado =))
Aditya MP
56
Se o ramo de rastreamento remoto ainda não existir, mas um ramo de rastreamento remoto existente estiver rastreado no momento, ele não poderá ser alterado para o novo ramo de rastreamento remoto existente. É necessário desabilitar o ramo de rastreamento remoto atual primeiro: git branch --unset-upstream- depois, ele funcionará conforme indicado nesta resposta (ou na próxima git push -u / --set-upstream).
hakre
88

Para mim, a correção foi:

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

Então:

git push
critikaster
fonte
3
É assim que o Github diz para fazê-lo. help.github.com/articles/changing-a-remote-s-url
fsharp
18
Na verdade, isso muda onde o controle remoto está, não altera o controle remoto que você está rastreando (tecnicamente) - você ainda está rastreando a "origem", apenas atualiza a definição de origem. Para alguns casos de uso, isso pode ser uma coisa ruim. Suponha que você bifurque o jQuery e crie um novo controle remoto. "origin" é seu fork, "upstream" é jQuery. Suponha que você precise rastrear temporariamente o repositório original em vez de seu garfo. Se você usou set-urle esqueceu-se de configurá-lo de volta, então futuros git pushcomandos seria um fracasso
stevendesu
42

Com um git atualizado (2.5.5), o comando é o seguinte:

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

Isso atualizará a filial rastreada remota para sua filial local atual

Ko2r
fonte
3
Bater git branch --set-upstream-to=origin/developlevantou o erro: error: the requested upstream branch 'origin/develop' does not exist. Anteriormente, renomei um ramo remoto para delelop.
belgoros
1
@belgoros git fetch --alltalvez?
Gabriel Devillers
25

Outra opção para ter muito controle sobre o que está acontecendo é editar suas configurações manualmente:

git config --edit

ou a taquigrafia

git config -e

Em seguida, edite o arquivo à vontade, salve e suas modificações serão aplicadas.

wranvaud
fonte
1
Isso salvou o dia para mim. Obrigado!
Martyn Chamberlin
Meu problema era que havia duas origens. (origem e origem-algo). Mas o mestre local estava rastreando "origin-algo". Mas eu queria que ele rastreasse "origem". A única maneira de mudar isso foi editando a configuração do git.
Aswin Prasad
19

Se você é sensato sobre isso, editar o arquivo de configuração é seguro o suficiente. Se você quer ser um pouco mais paranóico, pode usar o comando porcelain para modificá-lo:

git config branch.master.remote newserver

Obviamente, se você olhar a configuração antes e depois, verá que ela fez exatamente o que você faria.

Mas no seu caso individual, o que eu faria é:

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

Ou seja, se o novo servidor for o controle remoto canônico, por que não chamá-lo de origem como se você tivesse clonado originalmente?

Cascabel
fonte
3
Na verdade, eu já havia feito isso antes de resolver esse problema - o git era inteligente e carregou a renomeação remota para o arquivo de configuração, portanto, no seu exemplo, meu arquivo de configuração dizia 'origem antiga'.
Joachim
Pessoalmente, acho que dessa maneira faz mais sentido conceitualmente do que o aceito, mas acho que eles são funcionalmente equivalentes, correto?
Evan Donovan
1
@ Jeffromi: A remote renamenão faria o que está sendo solicitado, pois altera o nome do controle remoto nas [remote]configurações e nas [branch]configurações. Portanto, o que é preciso fazer neste caso é editar o arquivo de configuração e fazer o que você está dizendo (renomear remotos) apenas nas [remote]linhas de configuração.
Sumeet Pareek
7
git fetch origin
git checkout --track -b local_branch_name origin/branch_name

ou

git fetch
git checkout -b local_branch_name origin/branch_name
uma
fonte
Para o meu caso, eu precisava git fetch. Eu havia criado uma nova ramificação no bitbucket e queria mudar para ela. O git não conhece mudanças remotas, então eu tinha que fazer isso git fetchantes git checkout feature/new-feature-branch. Espero que isso ajude outra pessoa.
TelamonAegisthus 16/04/19
6

Este é o comando mais fácil:

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

Por exemplo, dado o comando git remote -vproduz algo como:

origin  ssh://[email protected]/~myself/projectr.git (fetch)
origin  ssh://[email protected]/~myself/projectr.git (push)
team    ssh://[email protected]/vbs/projectr.git (fetch)
team    ssh://[email protected]/vbs/projectr.git (push)

Para alterar o rastreamento da equipe:

git push --set-upstream team master
Andries
fonte
A ramificação a ser rastreada é opcional quando não há nada ambíguo. Usei sua sugestão ao me afastar do Github;) Obrigado.
precisa saber é
4

Você pode excluir sua ramificação atual e fazer:

git branch --track local_branch remote_branch

Ou mude alterar servidor remoto para o atual na configuração

RDL
fonte
não funcionou para mim, apenas o comando de trabalho foi o de @uma: git checkout --track -b local_branch_name origin/branch_name
Saad Benbouzid
2

Com base no que entendi da documentação mais recente do git , a sinopse é:

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

Esse uso parece ser um pouco diferente da resposta de urschrei, pois na sinopse dele é:

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

Eu estou supondo que eles mudaram a documentação novamente?

Arshan Khanifar
fonte
1

Na versão mais recente do git, como 2.7.4 ,

git checkout branch_name #branch name que você deseja alterar ramo de rastreamento

git branch --set-upstream-to=upstream/tracking_branch_name #upstream - nome remoto

Mohideen bin Mohammed
fonte
1

Eu achei a publicação de @critikaster útil, exceto que eu tive que executar esses comandos com o GIT 2.21:

$ git remote set-url origin https://some_url/some_repo
$ git push --set-upstream origin master
user8128167
fonte
0

a maneira mais fácil é simplesmente avançar para o novo ramo:

ramificação / nome de origem git push -u

ArthNRick
fonte