Se eliminó la rama remota de Git, pero aún aparece en 'branch -a'

552

Digamos que tenía una rama nombrada coolbranchen mi repositorio.

Ahora, decidí eliminarlo (tanto de forma remota como local) con:

git push origin :coolbranch
git branch -D coolbranch

¡Excelente! Ahora la rama está realmente eliminada.

Pero cuando corro

git branch -a

Todavía consigo:

remotes/origin/coolbranch

Algo para notar es que cuando clono un nuevo repositorio, todo está bien y git branch -ano muestra la rama.

Quiero saber: ¿hay alguna forma de eliminar la rama de la branch -alista sin clonar una nueva instancia?

yonix
fuente
58
Si usted git fetch -p(o git pull -p) entonces las ramas remotas serán podadas.
yoyo

Respuestas:

689

git remote prune origin, como se sugiere en la otra respuesta, eliminará todas esas ramas rancias. Eso es probablemente lo que desearía en la mayoría de los casos, pero si solo desea eliminar esa rama particular de seguimiento remoto, debe hacer lo siguiente:

git branch -d -r origin/coolbranch

(El -res fácil de olvidar ...)

-ren este caso "Enumerará o eliminará (si se usa con -d) las ramas de seguimiento remoto". de acuerdo con la documentación de Git que se encuentra aquí: https://git-scm.com/docs/git-branch

Mark Longair
fuente
11
git remote prune origino cualquier forma de git fetch --prunemarcado no funcionó para mí en mi caso. ... Pero git branch -d -r origin/feature/branch-namefuncionó. No estoy seguro de si tuvo algo que ver con estar debajo del featureespacio de nombres (flujo de git), pero así fue como se redujo, en caso de que algún googlers descubra que les sucede.
Misterparker
8
¿Hay alguna razón para que esto sea necesario? Parece realmente malo dejar estos nombres de rama inexistentes en la lista y no podarlos automáticamente.
akronymn
296

Tratar:

git remote prune origin

De la documentación remota de Git :

ciruela pasa

Elimina todas las ramas de seguimiento remoto obsoletas en <nombre>. Estas ramas obsoletas ya se han eliminado del repositorio remoto al que hace referencia <nombre>, pero aún están disponibles localmente en "remotes / <nombre>".

Con la opción --dry-run, informe qué ramas se podarán, pero en realidad no las pode.

Brian Phillips
fuente
1
Para completar: debe ser similar a lo git pull --prunemencionado en stackoverflow.com/a/17983126/94687 Y:git remote update --prune
imz - Ivan Zakharyaschev
230

No olvides lo asombroso

git fetch -p

que busca y poda todos los orígenes.

orip
fuente
Para completar: debe ser el mismo git remote prune originy similar al git pull --prunemencionado en stackoverflow.com/a/6127884/94687 y stackoverflow.com/a/17983126/94687 respectivamente. Y:git remote update --prune
imz - Ivan Zakharyaschev 01 de
2
Pero las ramas seguirán siendo visibles si corresgit branch -a
Nikhil Sahu
1
@NikhilSahu: Ya no veo las ramas remotas que se eliminaron congit branch -a
user276648
20

En nuestro caso particular, usamos Stash como nuestro repositorio remoto de Git. Intentamos todas las respuestas anteriores y nada funcionaba. Terminamos teniendo que hacer lo siguiente:

git branch –D branch-name (delete from local)
git push origin :branch-name (delete from remote)

Luego, cuando los usuarios iban a realizar cambios, tenían que hacer lo siguiente:

git fetch -p
Shadowvail
fuente
git branch -d branch-nametrabajó para mi. Aviso -Da -d. De hecho, cuando probé con mayúscula D -D, creó una nueva rama con el nombre -D
RP-
1
la "-D" es una forma de forzar la eliminación independientemente de su estado de inserción o fusión. Obviamente tenga cuidado al usarlo, pero en muchos casos, ha sido necesario.
Shadowvail
19

Utilizar:

git remote prune <remote>

Dónde <remote>está un nombre de fuente remota como origen o ascendente .

Ejemplo: git remote prune origin

likaiguo.happy
fuente
3
para los futuros lectores, aquí está la diferencia entre git remote prune, git prune,git fetch --prune .
Emile Bergeron