Git: Não consigo ver o novo branch remoto

118

Um colega enviou um novo branch remoto para origin / dev / homepage e não consigo vê-lo quando executo:

$ git branch -r

Ainda vejo ramos remotos preexistentes.

Presumo que isso seja porque meus refs remotos locais não estão atualizados, portanto, quando eu executei um git pull, nada aconteceu, pois o git pull só puxa no branch de trabalho atual correto? Ao contrário do git push, que empurra todos os branches que possuem alterações no branch remoto correspondente?

híbrido9
fonte
Um problema relacionado - Não consigo ver o ramal remoto
RBT
1
conseguiu esquecer git pull, obrigado
JelenaČuklina
1
No meu caso git fetch <name-of-remote>funcionou. Sem o nome do controle remoto, NÃO funcionou.
Menno Deij - van Rijswijk

Respostas:

166

Primeiro, verifique se o branch foi realmente empurrado remotamente, usando o comando git ls-remote origin. Se o novo branch aparecer na saída, tente e dê o comando git fetch: ele deve baixar as referências do branch do repositório remoto.

Se o seu branch remoto ainda não aparecer, verifique (na ls-remotesaída) qual é o nome do branch no remoto e, especificamente, se ele começa com refs/heads/. Isso ocorre porque, por padrão, o valor de remote.<name>.fetché:

+refs/heads/*:refs/remotes/origin/*

de modo que apenas as referências remotas cujo nome começa com refs/heads/serão mapeadas localmente como referências de rastreamento remoto em refs/remotes/origin/(ou seja, eles se tornarão ramos de rastreamento remoto)

Marco Leogrande
fonte
4
Consegui ver o novo branch remoto após fazer uma origem git fetch, mas não tenho certeza de qual seria a diferença se eu apenas fizesse um git fetch? Eu li sobre git remote update, mas não estava claro o que isso teria feito. Eu precisaria executar git fetch para quaisquer novos branches remotos daqui em diante?
híbrido
1
@ hybrid9 Se você usar git fetch, git baixará as referências do repositório remoto padrão que foi especificado em .git/config: normalmente ele será chamado origin, então os dois comandos são equivalentes, mas sua configuração específica pode ser diferente por algum motivo. Não, você não precisa dar git fetchpara cada branch, já que (por padrão) ele busca todos os branches.
Marco Leogrande,
1
@ hybrid9 git pullé equivalente a git fetch+ git merge(ou git rebasese você alterou os padrões), então você pode continuar usando git pullnormalmente, e os novos branches remotos aparecerão por si mesmos.
Marco Leogrande
1
Eu originalmente executei git pull, mas nunca vi esse novo branch remoto que realmente me confundiu. Somente até que executei git fetch origin. Agradeço o tempo em responder às minhas perguntas.
híbrido
2
@hybrid eu tenho o mesmo problema. git ls-remote gerritrepo:projectmostra o novo branch remoto mas git branch -anão ... Tenho que fazer outro clone e só então o novo branch aparecerá
Vikram
79

Verifique se .git/configcontém

[remote "origin"]
    url = …
    fetch = +refs/heads/master:refs/remotes/origin/master

Se sim, mude para dizer

[remote "origin"]
    url = …
    fetch = +refs/heads/*:refs/remotes/origin/*

Então você deve ser capaz de usá-lo:

$ git fetch
remote: Counting objects: …
remote: Compressing objects: ..
Unpacking objects: …
remote: …
From …
 * [new branch]            branchname -> origin/branchname
$ git checkout branchname
Branch branchname set up to track remote branch branchname from origin.
Switched to a new branch 'branchname'
Jesse Glick
fonte
12
Isso aconteceu comigo depois de um clone superficial inicial.
ArkTekniK de
Perfeito!!! Muito obrigado! Isso aconteceu comigo ao instalar um Homebrew tap personalizado com o comando brew tap user/repo: a cópia local do repo clonado por brewtinha as configurações que você mencionou e não foi possível ver e usar os outros branches que tinha em meu repo. Obrigado novamente! :) +1!
rmbianchi
3
O seguinte comando pode ser usado em vez da edição manual do arquivo .git / config . git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"e então git fetch originobter todas as ramificações na origem .
dotnetCarpenter
este é bom!
madz
47

A resposta mais simples é:

git fetch origin <branch_name>

Jacek Dziurdzikowski
fonte
2
Esta foi literalmente a ÚNICA coisa que funcionou para mim.
Theodore R. Smith
3
Não funciona para mim. Eu recebo este erro:fatal: Couldn't find remote ref <branch_name>
Parisa Khateri
3
sim funcionou para mim também, depois desse checkout git funcionou bem !!
whoami
30

Fazer uma atualização remota do git também atualizará a lista de branches disponíveis no repositório remoto.

Se você estiver usando o TortoiseGit, a partir da versão 1.8.3.0, você pode fazer "Git -> Sincronizar" e haverá um botão "Atualização remota" no canto inferior esquerdo da janela que aparece. Clique nisso. Então você deve ser capaz de fazer "Git -> Switch / Checkout" e ter o novo branch remoto aparecendo na lista suspensa de branches que você pode selecionar.

metaforja
fonte
18
git remote updateé uma maneira antiga de fazer isso, o comando preferido mais recente é git fetch.
Na minha versão do TortoiseGit (2.8.0.0), o botão no canto inferior esquerdo tem várias opções sob a seta e lembra o que você selecionou anteriormente. Isso significa que o botão pode não dizer "Atualização remota". Se você não o usou antes, aparecerá "Puxe". Então clique na seta e você verá "Atualização Remota" na lista de opções.
Michael Hinds
14

Digamos que estejamos procurando a versão / 1.0.5

Quando nãogit fetch -all está funcionando e você não pode ver o branch remoto e git branch -rnão mostrar este branch específico.

1. Imprima todas as referências remotas (branches, tags, ...):

git ls-remote origin Deve mostrar o branch remoto que você está procurando.

e51c80fc0e03abeb2379327d85ceca3ca7bc3ee5        refs/heads/fix/PROJECT-352
179b545ac9dab49f85cecb5aca0d85cec8fb152d        refs/heads/fix/PROJECT-5
e850a29846ee1ecc9561f7717205c5f2d78a992b        refs/heads/master
ab4539faa42777bf98fb8785cec654f46f858d2a        refs/heads/release/1.0.5
dee135fb65685cec287c99b9d195d92441a60c2d        refs/heads/release/1.0.4
36e385cec9b639560d1d8b093034ed16a402c855        refs/heads/release/1.0
d80c1a52012985cec2f191a660341d8b7dd91deb        refs/tags/v1.0

O novo branch 'release / 1.0.5' aparece na saída.

2. Forçar a busca de um branch remoto:

git fetch origin <name_branch>:<name_branch>

$ git fetch origin release/1.0.5:release/1.0.5

remote: Enumerating objects: 385, done.
remote: Counting objects: 100% (313/313), done.
remote: Compressing objects: 100% (160/160), done.

Receiving objects: 100% (231/231), 21.02 KiB | 1.05 MiB/s, done.
Resolving deltas: 100% (98/98), completed with 42 local objects.
From http://git.repo:8080/projects/projectX
 * [new branch]        release/1.0.5 -> release/1.0.5

Agora você também tem os refs localmente, você faz o checkout (ou qualquer outro) neste branch.

Tarefa concluída!

jpmottin
fonte
1
Você é um salva-vidas :)
Chakri
# 2 era o que eu procurava. Obrigado!
Mateus
4

Parece trivial, mas meu problema era que eu não estava no projeto certo. Certifique-se de estar no projeto em que espera estar; caso contrário, você não será capaz de puxar para baixo os ramos corretos.

BlackHatSamurai
fonte
Oooops! Um bom!
Marc
2

Usei força bruta e removi o controle remoto e depois o adicionei

git remote rm <remote>
git remote add <url or ssh>
Pato de borracha
fonte
1

O que acabou funcionando para mim foi adicionar o nome do repositório remoto ao git fetchcomando, assim:

git fetch core

Agora você pode ver todos eles assim:

git branch --all
Serj Sagan
fonte
0

Você pode fazer checkout remote branch / n git fetch && git checkout remotebranch

thao vu
fonte