Git: no se puede ver una nueva rama remota

116

Un colega empujó una nueva rama remota a origin / dev / homepage y no puedo verla cuando ejecuto:

$ git branch -r

Todavía veo ramas remotas preexistentes.

Supongo que esto se debe a que mis referencias remotas locales no están actualizadas, por lo tanto, cuando ejecuté un git pull, no pasó nada, ya que git pull solo extrae la rama de trabajo actual, ¿correcto? ¿A diferencia de git push que empuja todas las ramas que tienen cambios a la rama remota correspondiente?

híbrido9
fuente
Un problema relacionado - No puedo ver la rama remota
RBT
1
logré olvidar git pull, gracias
JelenaČuklina
1
En mi caso git fetch <name-of-remote>funcionó. Sin el nombre del control remoto, NO funcionó.
Menno Deij - van Rijswijk

Respuestas:

164

Primero, verifique que la rama haya sido enviada de forma remota mediante el comando git ls-remote origin. Si la nueva rama aparece en la salida, intente dar el comando git fetch: debería descargar las referencias de la rama desde el repositorio remoto.

Si su rama remota aún no aparece, verifique dos veces (en la ls-remotesalida) cuál es el nombre de la rama en el control remoto y, específicamente, si comienza con refs/heads/. Esto se debe a que, de forma predeterminada, el valor de remote.<name>.fetches:

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

de modo que solo las referencias remotas cuyo nombre comienza con refs/heads/se mapearán localmente como referencias de seguimiento remoto en refs/remotes/origin/(es decir, se convertirán en ramas de seguimiento remoto)

Marco Leogrande
fuente
4
Pude ver la nueva rama remota después de hacer un origen de búsqueda de git, pero no estoy seguro de cuál es la diferencia si solo hice una búsqueda de git. Leí sobre la actualización remota de git, pero no estaba claro qué habría hecho. ¿Necesitaría ejecutar git fetch para nuevas ramas remotas de aquí en adelante?
híbrido9
1
@ hybrid9 Si usa git fetch, git descargará las referencias del repositorio remoto predeterminado que se ha especificado en .git/config: generalmente se llamará origin, por lo que ambos comandos son equivalentes, pero su configuración específica puede ser diferente por alguna razón. No, no es necesario dar git fetchpor cada rama, ya que (por defecto) recupera todas las ramas.
Marco Leogrande
1
@ hybrid9 git pulles equivalente a git fetch+ git merge(o git rebasesi ha cambiado los valores predeterminados), por lo que puede seguir usando git pullcomo de costumbre, y las nuevas ramas remotas aparecerán por sí mismas.
Marco Leogrande
1
Originalmente ejecuté git pull pero nunca vi esa nueva rama remota que realmente me confundió. Solo hasta que ejecuté git fetch origin. Agradezco el tiempo para responder a mis preguntas.
híbrido9
2
@hybrid tengo el mismo problema. git ls-remote gerritrepo:projectmuestra la nueva rama remota pero git branch -ano ... Tengo que hacer otro clon y solo entonces aparecerá la nueva rama
Vikram
79

Compruebe si .git/configcontiene

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

Si es así, cámbielo para decir

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

Entonces deberías poder usarlo:

$ 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
fuente
12
Esto me sucedió después de un clon superficial inicial.
ArkTekniK
¡¡¡Perfecto!!! ¡Muchas gracias! Eso me sucedió al instalar un tap Homebrew personalizado con el comando brew tap user/repo: la copia local del repositorio clonado por brewtenía la configuración que mencionaste y no era posible ver y usar las otras ramas que tenía en mi repositorio. ¡Gracias de nuevo! :) +1!
rmbianchi
3
El siguiente comando se puede utilizar en lugar de editar manualmente el archivo .git / config . git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"y luego git fetch originobtener todas las ramas en origen .
dotnetCarpenter
esta es una bonita!
madz
47

La respuesta más simple es:

git fetch origin <branch_name>

Jacek Dziurdzikowski
fuente
2
Esto fue literalmente lo ÚNICO que funcionó para mí.
Theodore R. Smith
3
No funciona para mi. Recibo este error:fatal: Couldn't find remote ref <branch_name>
Parisa Khateri
3
sí, también funcionó para mí, ¡después de que este git checkout funcionó bien!
whoami
30

Hacer una actualización remota de git también actualizará la lista de ramas disponibles desde el repositorio remoto.

Si está utilizando TortoiseGit, a partir de la versión 1.8.3.0, puede hacer "Git -> Sync" y habrá un botón "Actualización remota" en la parte inferior izquierda de la ventana que aparece. Haga clic en eso. Entonces debería poder hacer "Git -> Switch / Checkout" y hacer que la nueva rama remota aparezca en el menú desplegable de ramas que puede seleccionar.

metaforja
fuente
18
git remote updatees una forma antigua de hacer esto, el comando preferido más nuevo es git fetch.
En mi versión de TortoiseGit (2.8.0.0), el botón en la parte inferior izquierda tiene múltiples opciones debajo de la flecha, y recuerda lo que seleccionó anteriormente. Esto significa que es posible que el botón no diga "Actualización remota". Si no lo ha usado antes, dirá "Tire". Entonces haga clic en la flecha y verá "Actualización remota" en la lista de opciones.
Michael Hinds
13

Digamos que estamos buscando la versión 1.0.5.

Cuando nogit fetch -all está funcionando y no puede ver la rama remota y git branch -rno mostrar esta rama específica.

1. Imprima todas las referencias desde remoto (sucursales, etiquetas, ...):

git ls-remote origin Debería mostrarte la rama remota que estás buscando.

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

La nueva rama 'release / 1.0.5' aparece en la salida.

2. Forzar la búsqueda de una rama remota:

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

Ahora también tiene las referencias localmente, realiza el pago (o lo que sea) de esta rama.

¡Trabajo hecho!

jpmottin
fuente
1
Eres un salvavidas :)
Chakri
# 2 era lo que estaba buscando. ¡Gracias!
Mateo
4

Suena trivial, pero mi problema era que no estaba en el proyecto correcto. Asegúrese de estar en el proyecto en el que espera estar; de lo contrario, no podrá tirar de las ramas correctas.

BlackHatSamurai
fuente
¡Vaya! ¡Buena!
Marc
2

Usé fuerza bruta y quité el control remoto y luego lo agregué

git remote rm <remote>
git remote add <url or ssh>
Pato de goma
fuente
1

Lo que finalmente funcionó para mí fue agregar el nombre del repositorio remoto al git fetchcomando, así:

git fetch core

Ahora puedes verlos todos así:

git branch --all
Serj Sagan
fuente
0

Puede verificar la rama remota / n git fetch && git checkout remotebranch

thao vu
fuente