Por qué Git usa los dos puntos (: <rama>) para eliminar la rama remota

81

¿Por qué Git usa

git push <remote> :<branch>

como en

git push origin :featureA

eliminar la rama featureAdel servidor remoto?

Me interesa saber por qué se utilizaron los dos puntos como marca de eliminación.

Es tan diferente de git branch -d <localbranch> .

¿Por qué no hacemos algo como

git branch -d --remote origin <branchname>

¿O hay un significado más profundo detrás del símbolo de dos puntos que no conocía?

escalopo
fuente
3
Para eliminar ramas remotas, ahora hay una sintaxis más bonitagit push origin --delete foobar
quetzalcoatl

Respuestas:

91

No es el significado del :per se, sino lo que está presente, o más bien ausente ante él.

El formato refspec es

<+><source>:<destination>

(opcional + para avance no rápido)

Entonces, cuando haces algo como git push origin :featureA, estás especificando una referencia de origen vacía y básicamente haciendo que el destino esté "vacío" o eliminándolo.

PD: tenga en cuenta que la especificación de referencia de :o nada no significa sin embargo no empujar nada a nada. Hace que git empuje ramas "coincidentes": para cada rama que existe en el lado local, el lado remoto se actualiza si ya existe una rama con el mismo nombre en el lado remoto.

manojlds
fuente
4
Git> = 1.7.0 agregado git push origin -d <branch>para eliminar y git push origin -D <branch>forzar la eliminación de una rama remota.
robsn
Entonces, ¿cuándo pondrías algo antes de:?
ITIA
@ITIA cuando su sucursal local tiene un nombre diferente al de la remota.
Listerreg
20

Los dos puntos no son una "bandera de eliminación". Tenga en cuenta que git push y git pull aceptan cero o más especificaciones de referencia como argumento (s) final (es). Ahora lea sobre refspecs . Dos puntos separan el origen del destino en una especificación de referencia. El comando git push origin :footiene una fuente vacía y esencialmente dice " no enviar nada a la rama foo de origen", o, en otras palabras, "hacer que la rama foo en origen no exista".

Ryan Stewart
fuente
En mi opinión, su respuesta no responde a la pregunta por la siguiente razón: si trato de empujar una rama cuyo historial ha divergido, necesito forzar el empuje de la rama. Sin embargo, este no es el caso cuando se elimina una rama con :foo. Una rama vacía no comparte el historial con una rama remota existente y, por lo tanto, no puede, a mi modo de ver, sobrescribir una rama remota existente con una rama vacía. Algo se siente mal con tu respuesta.
Umang
3
@Umang: afaik, es solo una cosa conceptual, y no dije "empuja una rama vacía". Dije "no empujes nada". No estoy en desacuerdo con su evaluación de que tendría más sentido con un "+" delante, pero así es como funciona. Vea la última sección del enlace de especificaciones de referencia que publiqué y decida si confía en el autor.
Ryan Stewart
Creo que ahora entiendo un poco mejor. ¡Gracias!
Umang