¿Cómo funcionan las ramas de Git? ¿Puedo eliminar la rama maestra?

22

Tengo un proyecto que tiene 2 sucursales, desarrollo y producción. No estoy usando la rama maestra y cada vez que la escribo git statusme dice qué tan lejos está mi rama de la maestra.

Cuando intento eliminar la rama maestra git branch -d master, la elimina solo en mi repositorio local y no en el servidor remoto de git. ¿Algunas ideas?

ufk
fuente

Respuestas:

34

En Git, una rama es solo una lista ordenada de confirmaciones (también conocido como checkins). Algo que puede ser un poco confuso para los nuevos usuarios es que las sucursales no necesitan tener un nombre (aunque en la mayoría de las circunstancias usted quiere uno); y no hay nada particularmente especial en ninguna rama en particular (la masterrama es solo la predeterminada que se crea cuando inicializa un repositorio).

Probablemente ya lo sepas, pero Git es diferente a otros sistemas de control de versiones como el popular "Subversion", porque cada "copia de trabajo" (en lenguaje Subversion) es un repositorio propio ... de hecho, no hay nada particularmente especial sobre cualquier copia en particular; excepto que una copia ha sido generalmente acordada como la "canónica" que se utiliza para almacenar el producto final.

Entonces, volviendo a su pregunta ... el repositorio "canónico" que clonó cuando comenzó su copia local contenía una rama "maestra" por defecto; y está atrapado Ahora, si tuviera acceso a la computadora que contiene el repositorio maestro, puede iniciar sesión y ejecutar:

git branch -d master

Sin embargo, si no puede hacerlo, puede hacerlo desde su máquina local. El git branchcomando tiene una -ropción que afecta el repositorio remoto. En otras palabras, ejecutar el siguiente comando debería funcionar:

git branch -d -r master

Tenga en cuenta que en ambos casos; Supongo que masterse ha fusionado completamente en el historial de desarrollo en el que se encuentra actualmente su copia local. Si nunca lo ha usado masterantes (es decir, solo se ha registrado en developmento production), no tiene nada de qué preocuparse. Sin embargo, si usted (u otra persona) ha estado revisando las cosas master, entonces podría tener un problema. Puede forzar una eliminación cambiando el -da -Den los comandos anteriores; ¡pero recomiendo comprobar para ver qué hay de masterantemano! Si no tiene acceso a la computadora remota, ¡probablemente no podrá recuperarla!


Por cierto; Si usted (o cualquier otra persona) es nuevo en Git, le recomiendo leer Git from the Bottom Up de John Wiegley . Aunque había usado Git un poco antes de encontrar este artículo, realmente no entendí cómo funcionaba hasta que lo leí. ¡Es bastante útil!

mparker17
fuente
3
Algún tiempo desde que escribí mi comentario original, el comportamiento de git cambió ligeramente. A partir de git 1.7.12, git branch -d -r masterya no elimina la rama remota, elimina el conocimiento de su copia local de la rama remota. ¡La próxima vez que vuelvas git fetch, la rama volverá! En cambio, querrás correr git push origin :master. Esencialmente, lo que está haciendo aquí es empujar una rama nula (el nombre de la rama vacía a la izquierda de la :) sobre la parte superior de la rama remota (el nombre de la rama a la derecha de la :), eliminándola efectivamente.
mparker17
También debe tener en cuenta que cuando clona un repositorio, normalmente, por defecto, echa un vistazo a master. Esto depende de la referencia HEAD en el repositorio que está clonando. Entonces, después de eliminar el maestro, asegúrese de que HEAD apunte a la rama que desea como predeterminada.
Zitrax
Su enlace a Git desde abajo hacia arriba ha muerto, pero parece que este es el texto al que se refiere (?) ¿Podría confirmar y quizás actualizar el enlace en la respuesta?
O Mapper
O Mapper: Ese es el texto al que me refiero: ¡gracias por el nuevo enlace! He actualizado el enlace en la respuesta.
mparker17
4

masteres la rama predeterminada para git. No sé por qué es tan terrible para ti cuando git te dice qué tan lejos estás del maestro, pero si quieres eliminar una rama en tu repositorio remoto, eliminarlo localmente no es suficiente. Intenta esto en su lugar:

git push origin :master

Esto no enviará nada (la parte anterior a los dos puntos) a su servidor de origen y sobrescribirá el maestro. En otras palabras, debería eliminar la rama maestra de forma remota.

innaM
fuente
Obtengo: remoto: error: negarse a eliminar la rama actual: refs / heads / master A github.com ***. Git ! Error de maestro [rechazado remotamente] (eliminación de la rama actual prohibida): error al insertar algunas referencias a ' github.com ***. git'
Totty.js
1
@Totty quizás esto pueda ayudar: matthew-brett.github.io/pydagogue/gh_delete_master.html
MEM