'git branch -av' que muestra la rama remota que ya no existe

168

Esta es probablemente una pregunta tonta, pero soy nuevo en git y veo una rama remota que ya no existe.

$ git branch -a
* master
  remotes/origin/master
  remotes/origin/production

No creo que la rama de producción exista remotamente y no puedo entender por qué todavía se muestra localmente. ¿Cómo puedo eliminar / eliminar esta rama? Así es como se ve un intento de eliminarlo:

$ git push origin :production

error: unable to push to unqualified destination: production
The destination refspec neither matches an existing ref on the remote nor
begins with refs/, and we are unable to guess a prefix based on the source ref.
error: failed to push some refs to 'git@IP:puppet.git'

Puedo pagar la rama de producción supuestamente remota, pero obtengo esto:

$ git checkout origin/production
Note: checking out 'origin/production'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at c323996... added powerdns module, no really

No tengo idea de qué diablos estoy haciendo. Cualquier ayuda sería apreciada.

CarpeNoctem
fuente
¿Cuál es el resultado de git branch -adespués de un git fetch?
alediaferia
El duplicado que propuse tiene una respuesta que explica mucho más de lo que lo hicieron los manojlds aquí.
Cascabel

Respuestas:

338

Tu tienes que hacer:

git remote prune origin
manojlds
fuente
8
Gracias que funcionó! ¿Puedes dar más detalles sobre lo que sucede detrás de escena?
CarpeNoctem
12
Estas son sucursales de seguimiento remoto en su repositorio local y debe borrarlas si las sucursales se eliminan en el repositorio remoto.
manojlds
2
Raramente encuentro e implemento tan rápidamente una pregunta y respuesta tan directa.
jleach
Excelente. En mi local, estaba viendo ramas extrañas que no tenían conexión con el repositorio de base de código. Cuando ejecuté este comando, sintonicé mi rama de origen local y luego agregué el maestro aguas arriba. Gracias
Ankur Srivastava
54

Entonces hay dos problemas. En ambos casos, recuerde que Git se distribuye.

Primero. Cuando haces cosas como

$ git branch -a

la operación se realiza en su repositorio local, NO en la computadora remota. En otras palabras, su repositorio local informa todas las sucursales que conoce. Estas podrían ser ramas locales (como 'maestro') o ramas remotas que ha obtenido de un control remoto. Desde la última búsqueda, la rama de 'producción' del repositorio remoto ha cambiado, pero su repositorio local no lo sabe. La respuesta de manojlds es correcta. correr

$ git origen de ciruela remota

para quitar ramas rancias.

El comando 'git push origin: production' se usa para eliminar la rama del repositorio git de la computadora remota. No es tu repositorio local. En este caso, otra persona ya ha eliminado la rama en el repositorio git de la computadora remota, por lo que verá este mensaje de error.

Aquí hay un enlace que resume estos comandos.

El segundo problema trata con el pago.

Al retirar una sucursal, desea hacerlo desde una sucursal local , no desde la sucursal remota. Es por eso que obtiene el error sobre un HEAD separado. El repositorio de git-notes tiene una buena explicación del problema con detalles sangrientos. Básicamente la frase clave es

Sin embargo, cuando realiza el pago de cualquier cosa que no sea un nombre de sucursal local adecuado, HEAD ya no es una referencia simbólica a nada. En cambio, en realidad contiene el hash SHA-1 (el id de confirmación) de la confirmación a la que está cambiando.

Ahora, ¿cómo verificar una sucursal local, que es lo mismo que la sucursal remota?

Fácil, crea una sucursal local, en el momento de finalizar la sucursal remota.

$ git checkout -b my_local_branch origen / producción

Pablo Maurin
fuente
20
git remote prune origin

es correcto, solo agregando que puede usar la --dry-runopción, que informa qué ramas se podarán de su repositorio local, pero en realidad no las poda

git remote prune origin --dry-run
0xcrab
fuente