¿Por qué Git usa
git push <remote> :<branch>
como en
git push origin :featureA
eliminar la rama featureA
del 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?
git push origin --delete foobar
Respuestas:
No es el significado del
:
per se, sino lo que está presente, o más bien ausente ante él.El formato refspec es
(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.fuente
git push origin -d <branch>
para eliminar ygit push origin -D <branch>
forzar la eliminación de una rama remota.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 :foo
tiene 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".fuente
: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.