¿Por qué Git usa dos puntos (:) para eliminar sucursales remotas?

3 minutos de lectura

avatar de usuario
escalopo

¿Por qué Git usa

git push <remote> :<branch>

como en

git push origin :featureA

para eliminar la rama featureA desde el servidor remoto?

Estoy interesado en por qué se usaron los dos puntos como indicador 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?

  • Para eliminar sucursales remotas, ahora hay una sintaxis más bonita git push origin --delete foobar

    – quetzalcóatl

    5 de noviembre de 2015 a las 13:56


No es el significado de la : per se, sino lo que está presente, o más bien ausente ante ella.

El formato refspec es

<+><source>:<destination>

(opcional + para avance no rápido)

Así que cuando haces algo como git push origin :featureAestá especificando una referencia de fuente vacía y básicamente haciendo que el destino esté “vacío” o eliminándolo.

PD: Tenga en cuenta que la refspec de : o nada no significa empujar nada a nada sin embargo. 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.

  • Git >=1.7.0 agregado git push origin -d <branch> para borrar y git push origin -D <branch> para forzar la eliminación de una rama remota.

    – robar

    10 de mayo de 2017 a las 7:53

  • Entonces, ¿cuándo pondrías algo antes de 😕

    – ITIA

    12/07/2019 a las 21:45

  • @ITIA cuando su sucursal local tiene un nombre diferente al de la remota.

    – listerreg

    28 de febrero de 2020 a las 15:30

avatar de usuario
ryan stewart

Los dos puntos no son una “bandera de eliminación”. Tenga en cuenta que empujar git y tirar de git ambos aceptan cero o más refspecs como su(s) argumento(s) final(es). Ahora Lea acerca de las especificaciones de referencia. Dos puntos separan el origen del destino en una refspec. El comando git push origin :foo tiene una fuente vacía y esencialmente dice “empujar ninguna cosa to branch foo of origin”, o, en otras palabras, “hacer que branch foo on origin no exista”.

  • 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 usando :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

    5 de septiembre de 2011 a las 4:02

  • @Umang: afaik, es solo una cosa conceptual, y no dije “empujar 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. Ver el última sección del enlace refspecs que publiqué y decide si confías en el autor.

    –Ryan Stewart

    5 de septiembre de 2011 a las 4:06


  • Creo que ahora entiendo un poco mejor. ¡Gracias!

    – Umang

    5 de septiembre de 2011 a las 4:27

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad