usar una tag qué podemos para hacer from etiqueta eliminar create crear como comando git github version-control git-branch git-gui

una - ¿Cuándo borrar sucursales en Git?



git-- tags (8)

Supongamos que tenemos una aplicación que es estable.

Mañana, alguien informa un gran error que decidimos corregir de inmediato. Así que creamos una rama para esa revisión a partir de "master", la llamamos "2011_Hotfix", y la impulsamos para que todos los desarrolladores puedan colaborar en su reparación.

Arreglamos el error y fusionamos "2011_Hotfix" en "master", así como en la rama de desarrollo actual. Y empuje "maestro".

¿Qué hacemos con "2011_Hotfix" ahora? ¿Debería simplemente quedarse allí como una rama para siempre hasta el fin de los tiempos o deberíamos eliminarlo ahora, ya que ha cumplido su propósito? Parece impuro dejar las ramas por todas partes, ya que la lista de ramas probablemente se hará muy larga, la mayoría de las cuales ya ni siquiera son necesarias.

En caso de que se elimine, ¿qué pasará con su historial? ¿Se mantendrá eso, aunque la sucursal real ya no esté disponible? Además, ¿cómo puedo eliminar una rama remota?


Como la pregunta tiene la etiqueta "github", también agregaría esto: específicamente en Github , si solicita una sucursal y se fusiona (ya sea a través de la interfaz de usuario o combinando la rama de la solicitud de extracción), no lo hará. pierda los datos de solicitud de extracción (incluidos los comentarios), incluso si elimina la rama .

Una consecuencia de esto: si incorpora solicitudes de extracción como parte de su flujo de trabajo (que se combina con las revisiones de código), puede eliminar de forma segura las sucursales tan pronto como se combinen. Esto es tan común que recientemente Github agregó una característica (dulce) que muestra el botón "eliminar rama" justo después de fusionar una solicitud de extracción.

Pero vale la pena notar que cada grupo debe adoptar el flujo de trabajo que mejor se adapte a él (y puede o no llevar a la eliminación de dichas sucursales). Mi equipo de trabajo actual, por ejemplo, elimina todas las ramas que no están relacionadas con el dominio o la implementación (p. Ej., Producción, organización, etc.) tan pronto como se combinan sus solicitudes de extracción, y aún tenemos un seguimiento completo de cómo se formaron las confirmaciones relacionadas Cada mejora incremental de cada producto.

Por supuesto, ninguna gestión de historial (solicitudes de extracción o de otro tipo) reemplaza el etiquetado adecuado de las versiones (que preferiblemente automatiza con la misma herramienta / script que implementa / empaqueta una versión), por lo que siempre puede cambiar rápidamente a lo que sea que tengan sus usuarios. en un momento dado El etiquetado también es la clave para resolver su problema original: si establece que cualquier rama fusionada con las ramas de "trabajo" puede y debe eliminarse, y que cualquier que se fusione con una etiqueta de versión, "producción", etc. no debería , siempre tendrá las revisiones activas hasta que se integren en una versión futura.


Lo que debes hacer es etiquetar cualquier cosa que sueltes. Mantenga las ramas alrededor para cuando se está desarrollando activamente.

Eliminar ramas viejas con

git branch -d branch_name

Eliminarlos del servidor con

git push origin --delete branch_name

o la sintaxis antigua

git push origin :branch_name

que se lee como "empujar nada en branch_name en el origen".

Dicho esto, mientras el DAG (gráfico acíclico dirigido) pueda señalarlo, los compromisos estarán allí en la historia.

Google "git-flow" y eso puede dar más información sobre la administración de lanzamientos, la ramificación y el etiquetado.


Parece que desea eliminar la rama 2011_Hotfix sin perder su historial. Discutiré la eliminación primero y luego la historia.

Los métodos habituales de eliminación de ramas de git ya se han descrito anteriormente y funcionan como se esperaba. git no tiene un comando de una o dos palabras que significa "Oye git , elimina tanto la rama local como la remota". Pero este comportamiento puede ser imitado a través de shell script. Por ejemplo, tome el script de shell de Zach Holman ''git-nuke'' . Es muy simple:

#!/bin/sh git branch -D $1 git push origin :$1

Ponga esto en un archivo ejecutable (por ejemplo, git-nuke ) en uno de sus directorios de $PATH . Si no está en la rama 2011_Hotfix , simplemente ejecutando git-nuke 2011_Hotfix eliminará tanto la rama local como la remota. Esto es mucho más rápido y simple, aunque quizás más peligroso, que los comandos git estándar.

Tu preocupación por preservar la historia es buena. En este caso, no hay que preocuparse. Una vez que 2011_Hotfix en el master , todas las confirmaciones de 2011_Hotfix se agregarán al historial de confirmaciones del master . En resumen, no perderá la historia de una simple fusión.

Tengo una palabra más para agregar que tal vez esté más allá del alcance de su pregunta, pero aún así es relevante. Imaginemos que hay 20 confirmaciones pequeñas de "trabajos en curso" en 2011_Hotfix ; sin embargo, desea que solo se 2011_Hotfix un compromiso completo para 2011_Hotfix al historial del master . ¿Cómo se combinan los 20 pequeños compromisos en un gran compromiso? Afortunadamente, git permite consolidar múltiples confirmaciones en una confirmación utilizando git-rebase . No explicaré aquí cómo funciona eso; sin embargo, si está interesado, la documentación para git-rebase es excelente. Tenga en cuenta que git rebase reescribe el historial, por lo que debe usarse con prudencia, especialmente si es nuevo en él. Finalmente, su escenario 2011_Hotfix se trata de un equipo de desarrollo, no de un solo. Si los miembros del equipo del proyecto usan git rebase , es prudente que el equipo tenga pautas explícitas sobre el uso de git rebase para que algunos desarrolladores de vaqueros en el equipo no dañen sin saberlo la historia de git un proyecto.


Puede eliminar sucursales en todas las principales interfaces de usuario web, como github, BitBucket. Después de eliminar la sucursal en línea, puede eliminar la sucursal local usando

git remote prune origin


Si desea podar las ramas locales que se han eliminado del origen, también puede podar, mientras usa git fetch

git fetch --prune


Si se ha vuelto a fusionar con éxito y quizás incluso se ha etiquetado, diría que ya no sirve. Así que puedes hacer con seguridad git branch -d branchname .


Yo agregaría que la desventaja de eliminar sucursales es que romperá cualquier hipervínculo a esas sucursales en GitHub (esta pregunta está etiquetada como github). Obtendrá un error 404 Not Found para esos enlaces. Es por eso que cambio mis enlaces para que apunten a un compromiso o etiqueta después de eliminar una rama en GitHub.

Debido a que algunos enlaces no se pueden cambiar, como en el correo electrónico, ahora evito el hipervínculo a las sucursales de GitHub por completo y un enlace a una confirmación o etiqueta desde el primer día.

Prefiero eliminar las ramas después de que se fusionen. Esto evita el desorden visual de una larga lista de ramas en su repositorio. Estas ramas también se propagan a todas las bifurcaciones del repositorio.

Primero borro mi sucursal local. Esto evita que se empuje accidentalmente más tarde.

git branch -d branchName

Luego borro la rama de seguimiento remoto

git branch -dr remoteName/branchName

Luego borro la rama en GitHub. Utilizo la interfaz web, pero el comando equivalente está debajo.

git push remoteName :branchName

Incluso si la rama nunca se fusiona, por lo general me gustaría mantener los compromisos para la posteridad. Sin embargo, todavía me gusta eliminar la rama. Para difundir las confirmaciones y evitar que sean devoradas por el recolector de basura, hago una etiqueta anotada que apunta a la misma confirmación que la rama eliminada.

git tag -a tagName commitOrBranchName

Luego presiono la etiqueta para github

git push remoteName tagName


Puede eliminar de forma segura una rama con git branch -d yourbranch . Si contiene cambios no combinados (es decir, perdería confirmaciones al eliminar la rama), git le informará y no lo eliminará.

Por lo tanto, eliminar una rama fusionada es barato y no hará que pierdas ningún historial.

Para eliminar una rama remota, use git push origin :mybranch , asumiendo que su nombre remoto es origen y la rama remota que desea eliminar se denomina mybranch.