Fazer uma ramificação Git existente rastrear uma ramificação remota?

3535

Sei como criar uma nova ramificação que rastreia ramificações remotas, mas como faço para que uma ramificação existente rastreie uma ramificação remota?

Eu sei que posso apenas editar o .git/configarquivo, mas parece que deve haver uma maneira mais fácil.

Pat Notz
fonte
26
Conforme observado abaixo, para uma ramificação existente, você pode usar git push -u origin branch-name.
Zags
3
Se filial local é branch atual e filial local não estiver rastreando um controle remoto, git pullmuitas vezes, fornecer mensagens úteis sobre o comando adequado para definir as informações de rastreamento
billrichards
57
É irritante quando alguém está aprendendo que o git é mostrado como um link para a documentação do git. Essa documentação parece ter sido escrita para pessoas que sabem o que estão fazendo com o git.
Felipe Alvarez
9
a partir de Git 2.10 você deve primeiro check-out para destinar filial local e, em seguida, fazer issogit branch --set-upstream-to origin/<branch>
Mahdi Javaheri
2
--set-upstreamproduz um erro: fatal: the '--set-upstream' option is no longer supported. Please use '--track' or '--set-upstream-to' instead.assim git branch --set-upstream-to origin/<branch name>como o comando atual que funciona.
Super Jade

Respostas:

4270

Dada uma ramificação fooe um controle remoto upstream:

A partir do Git 1.8.0:

git branch -u upstream/foo

Ou, se a ramificação local foonão for a ramificação atual:

git branch -u upstream/foo foo

Ou, se você deseja digitar comandos mais longos, estes são equivalentes aos dois acima:

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

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

A partir do Git 1.7.0:

git branch --set-upstream foo upstream/foo

Notas:

  • Todos os comandos acima farão com que a filial local foorastreie a filial fooremota upstream.
  • A sintaxe antiga (1.7.x) foi preterida em favor da nova sintaxe (1.8+). A nova sintaxe pretende ser mais intuitiva e fácil de lembrar.
  • A definição de uma ramificação upstream falhará quando executada em controles remotos recém-criados que ainda não foram buscados. Nesse caso, execute git fetch upstreamantecipadamente.

Veja também: Por que eu preciso fazer o `--set-upstream` o tempo todo?

Dan Moulding
fonte
124
"Upstream" é o nome do controle remoto? ou seja, o que a maioria chamaria de "origem" por padrão?
Andrew Vit 26/06
172
@ Andrew: Sim. git branch --set-upstream master origin/masterseria equivalente ao que é feito automaticamente quando você clona inicialmente um repositório.
Dan Molding
62
Em uma nota relacionada, adicionando isso ao seu gitconfig é incrível: "[impulso] default = rastreamento" isso vai fazer com que empurra vai seguir o mesmo lugar que puxa vêm de :)
jpswain
61
Recebo "fatal: Não é um nome de objeto válido: 'origem / mestre'."
31911 joachim
84
git push -u origin foo via
Cotton
236

Você pode fazer o seguinte (supondo que você fez check-out no master e deseja enviar para um master de filial remota):

Configure o 'remoto' se ainda não o tiver

git remote add origin ssh://...

Agora configure o mestre para saber como rastrear:

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

E empurre:

git push origin master
Paul Hedderly
fonte
é realmente necessário o controle remoto e o ramo no push? Quero dizer, você só precisa se o seu ramo com check-out não for o que você deseja enviar, certo?
Doppelganger
5
Sim - mas a partir da memória, talvez você precise ser explícito para o primeiro envio. Pode facilmente ser testado é claro ... :)
Paul Hedderly
+1 Esta é a resposta para usuários do Windows que estão presos à "visualização" do msysgit anterior a 1.8. Obrigado por isso.
João
3
Esta é a única resposta que funcionou para mim. Quando eu tentei a resposta aceita, para ajustar o controle remoto a montante para um ramo existente, eu tenho: error: the requested upstream branch 'upstream/master' does not exist.
Steve K
4
@SteveK é mais provável porque seu upstream é chamado origine não upstream.
trema
160

Faço isso como um efeito colateral de pressionar com a -uopção como em

$ git push -u origin branch-name

A opção longa equivalente é --set-upstream.

O git-branchcomando também entende --set-upstream, mas seu uso pode ser confuso. A versão 1.8.0 modifica a interface.

git branch --set-upstreamestá obsoleto e pode ser removido em um futuro relativamente distante. git branch [-u|--set-upstream-to]foi introduzido com uma ordem mais séria de argumentos.

...

Era tentador dizer git branch --set-upstream origin/master, mas isso diz ao Git para organizar a ramificação local "origem / mestre" para integrar-se à ramificação com check-out atualmente, o que é altamente improvável o que o usuário quis dizer. A opção está obsoleta; use a nova opção --set-upstream-to(com um pequeno e doce -u).

Digamos que você tenha uma foofilial local e queira que ela trate a filial com o mesmo nome que a montante. Faça isso acontecer com

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

ou apenas

$ git branch --set-upstream-to=origin/foo foo
Greg Bacon
fonte
1
Esta é uma solução muito melhor imo
Nils_e 7/09/17
--set-upstream-to=...é exatamente o que eu estava procurando.
Richard
54

Você pode achar a git_remote_branchferramenta útil. Oferece comandos simples para criar, publicar, excluir, rastrear e renomear filiais remotas. Um recurso interessante é que você pode pedir a um grbcomando para explicar quais comandos git ele executaria.

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
James Mead
fonte
3
OOG é uma jóia de rubi que pode ser acessado como explicado na sua github
mcabrams
6
O OP está fazendo perguntas sobre o próprio Git. Portanto, não introduza uma nova ferramenta provavelmente seria melhor.
Zeekvfu
O grb é um alias para o git-rebase na minha instalação do macOS. Eu não fazer isso :)
Ben Sinclair
53

Na verdade, para que a resposta aceita funcione:

git remote add upstream <remote-url>
git fetch upstream
git branch -f --track qa upstream/qa
# OR:
git branch --set-upstream qa upstream/qa
Ouriço
fonte
A filial local já estava rastreando uma filial, portanto, podemos assumir que o repositório remoto já foi adicionado.
Doppelganger
Dopplerganger: Veja o comentário de joachim para a resposta aceita. Enfim suposições prontamente diferem - é o que torna as coisas tão interessantes;)
Hedgehog
44

Acredito que já no Git 1.5.x você poderia fazer uma filial local $BRANCHrastrear uma filial remota origin/$BRANCH, como esta.

Dado isso $BRANCHe origin/$BRANCHexiste, e você não fez o check-out no momento $BRANCH(mude se tiver), faça:

git branch -f --track $BRANCH origin/$BRANCH

Isso recria $BRANCHcomo um ramo de rastreamento. As -fforças a criação apesar de $BRANCHjá existir. --tracké opcional se os padrões usuais estiverem em vigor (ou seja, o parâmetro git-config branch.autosetupmergeé verdadeiro).

Observe que, se origin/$BRANCHainda não existir, você poderá criá-lo colocando seu local $BRANCHno repositório remoto com:

git push origin $BRANCH

Seguido pelo comando anterior para promover a filial local em uma filial de rastreamento.

wu-lee
fonte
1
git push origin $BRANCHera o que eu estava procurando.
Utilizador
Depois de tentar todos os tipos de soluções, incluindo a configuração de um upstream como descrito acima, nada funcionou. Tudo o que eu queria fazer era puxar 1 nova confirmação para minha filial local de uma remota e não configurei o rastreamento inicialmente. O comando git branch -f --track $BRANCH origin/$BRANCHfaz o truque.
DemitryT
38

1- atualize seus meta-dados locais usando: git fetch --all

insira a descrição da imagem aqui

2- mostre suas filiais remotas e locais usando: git branch -a , veja a seguinte captura de tela

insira a descrição da imagem aqui

3- alterne para o ramo de destino que você deseja vincular ao controle remoto: usando

git checkout branchName

exemplo:

insira a descrição da imagem aqui

4- Conecte sua filial local a uma filial remota usando:

git branch --set-upstream-to nameOfRemoteBranch

NB: nameOfRemoteBranch : para copiar da saída da etapa 2 "git branch -r"

Exemplo de uso:

insira a descrição da imagem aqui

Monsif EL AISSOUSSI
fonte
1
Resposta principalmente fácil e simples.
precisa saber é o seguinte
25

Certifique-se de executar:

git config push.default tracking

ser capaz de empurrar sem problemas

romanlv
fonte
1
Isso pode ser conveniente. No entanto, podemos observar que, de acordo com git-config(1)a página do manual, trackingé um sinônimo obsoleto de upstream.
Foof
23

A edição .git/configé provavelmente a maneira mais fácil e rápida. É o que os comandos do Git para lidar com ramificações remotas estão fazendo, de qualquer maneira.

Se você não quiser mexer com o arquivo manualmente (e não é tão difícil de fazer), você sempre pode usá git config-lo ... mas, novamente, isso vai editar o .git/configarquivo de qualquer maneira.

É claro que existem maneiras de rastrear automaticamente uma ramificação remota ao usar git checkout(passando a --trackbandeira, por exemplo), mas esses comandos funcionam com novas ramificações, não as existentes.

mipadi
fonte
18

Em muito curto

git branch --set-upstream yourLocalBranchName origin/develop

Isso fará com que você yourLocalBranchNamerastreie o ramo remoto chamado develop.

MadNik
fonte
1
@Quincy Verifique a resposta de Greg - use git push -u origin branch(ou --set-upstream-to) em vez #
Tobias Kienzler
@ MadNik, qual é a diferença entre --set-upstreame --track? Não entendo muito bem por que devo usar um sobre o outro.
Acumenus 31/03
15

No 1.6.x, isso pode ser feito usando a ferramenta git_remote_branch :

grb track foo upstream

Isso fará com que o Git faça o foorastreamento upstream/foo.

wik
fonte
12

Eu uso o seguinte comando (suponha que o nome da filial local seja "branch-name-local" e o nome da filial remota seja "branch-name-remote"):

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

Se as ramificações local e remota tiverem o mesmo nome, faça o seguinte:

$ git branch --set-upstream-to=origin/branch-name branch-name
yrazlik
fonte
Você inverteu "nome da filial" e "origem / nome da filial" na linha de comando. A montante vem antes do local.
maharvey67
@ maharvey67 você está certo, obrigado. Editou a resposta.
yrazlik
Este foi o ouro, obrigado, também, porque nenhuma das opções dentro a resposta aceitos são ok quando você tem barras no nome de filial
JBoy
8

Aqui, usando githube git version 2.1.4, basta fazer:

$ git clone [email protected]:user/repo.git

E os controles remotos vêm por si só, mesmo que não estejam vinculados localmente:

$ git remote show origin

* remote origin
  Fetch URL: [email protected]:user/repo.git
  Push  URL: [email protected]: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)

Mas é claro, ainda não há filial local:

$ git branch
* master                  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

Vejo? Agora, se você fizer o check-out develp, ele fará a mágica automaticamente:

$ git checkout develop
Branch develop set up to track remote branch develop from origin.
Switched to a new branch 'develop'

Tão fácil!


Resumo. Basta executar estes 2 comandos:

$ git clone [email protected]:user/repo.git
$ git checkout develop
Dr Beco
fonte
1
Um excelente exemplo do meu caso de uso idêntico. Apesar de nenhum sinal de uma ramificação local 'desenvolva', quando eu verifiquei a ramificação 'desenvolva', essa ramificação aparece e é magicamente configurada para rastrear a ramificação remota 'desenvolver' da origem. Agradeço o exemplo e explicação passo a passo!
ElliotPsyIT
8

Use a opção '--track'

  • Após um git pull:

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

  • Ou:

    git fetch && git checkout <branch-name>

Loukan ElKadi
fonte
7

Para criar uma nova ramificação, poderíamos usar o seguinte comando

 git checkout --track -b exemplo origem / exemplo 
Para que o ramo já criado crie um link entre remoto e, a partir desse ramo, use o comando abaixo

 git branch -u origin / remote-branch-name

jithu reddy
fonte
5

Esta não é uma resposta direta a esta pergunta, mas gostaria de deixar uma nota aqui para qualquer pessoa que esteja com o mesmo problema que eu ao tentar configurar uma ramificação upstream.

Desconfie de push.default .

Nas versões mais antigas do git, o padrão era correspondente , o que causaria um comportamento muito indesejável se você tivesse, por exemplo:

Rastreamento "mestre" da filial local até a origem / mestre

Rastreamento remoto "upstream" da ramificação para upstream / master

Se você tentar "git push" quando estiver no ramo "upstream", com a correspondência push.default, o git tentará mesclar automaticamente o branch local "master" em "upstream / master", causando muito caos.

Isso fornece um comportamento mais sensato:

git config --global push.default upstream

Tom Mettam
fonte
Você não deixou isso em vão. Obrigado.
31517 stefgosselin
4

De uma maneira um pouco relacionada, eu estava tentando adicionar uma ramificação de rastreamento remoto a uma ramificação existente, mas não tinha acesso a esse repositório remoto no sistema em que desejava adicionar essa ramificação de rastreamento remoto (porque geralmente exporto uma cópia deste repo via sneakernet para outro sistema que tenha acesso para enviar para esse controle remoto). Descobri que não havia como forçar a adição de uma ramificação remota no local que ainda não havia sido buscada (o local não sabia que a ramificação existia no remoto e eu receberia o erro the requested upstream branch 'origin/remotebranchname' does not exist:).

No final, consegui adicionar a nova ramificação remota desconhecida anteriormente (sem buscar) adicionando um novo arquivo de cabeçalho em .git/refs/remotes/origin/remotebranchnamee depois copiando o ref (o globo ocular era mais rápido, mais coxo ;-) do sistema com acesso à origem repo para a estação de trabalho (com o repo local em que eu estava adicionando a filial remota).

Feito isso, eu poderia usar git branch --set-upstream-to=origin/remotebranchname

Ville
fonte
3

ou simplesmente por:

mude para o ramo se você ainda não estiver nele:

[za]$ git checkout branch_name

corre

[za]$ git branch --set-upstream origin branch_name
Branch origin set up to track local branch brnach_name by rebasing.

e você está pronto para:

 [za]$ git push origin branch_name

Você já pode dar uma olhada no arquivo de configuração para ver o que está rastreando o que, executando:

 [za]$ git config -e

Também é bom saber disso, mostra quais ramificações são rastreadas e quais não são. :

  [za]$ git remote show origin 
zee
fonte
0

Para quem, como eu, apenas deseja sincronizar o nome da sua filial local com o nome da filial remota, aqui está um comando útil:

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

Para evitar lembrar o que você precisa fazer sempre que receber a mensagem:

Especifique com qual filial você deseja mesclar. Veja git-pull (1)
para detalhes.
.....

Você pode usar o seguinte script que define a origem como upstream para a ramificação atual você está.

No meu caso, quase nunca defini outra coisa senão a origem como o upstream padrão . Também quase sempre mantenho o mesmo nome de filial para filial local e remota. Então, o seguinte me cabe:

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

Isso também funcionaria

git branch --set-upstream-to=/< remote>/< branch> < localbranch>
Abhi
fonte