Supongamos que tenemos una aplicación estable.
Mañana, alguien informa de un gran error que decidimos corregir de inmediato. Así que creamos una rama para ese hotfix fuera de "master", lo llamamos "2011_Hotfix", y lo empujamos hacia arriba para que todos los desarrolladores puedan colaborar en solucionarlo.
Solucionamos el error y fusionamos "2011_Hotfix" en "maestro", así como en la rama de desarrollo actual. Y empuje "maestro".
¿Qué hacemos con "2011_Hotfix" ahora? ¿Debería permanecer allí como una rama para siempre hasta el final de los tiempos o deberíamos eliminarlo ahora, ya que ha cumplido su propósito? Parece impuro dejar ramas por todas partes, ya que la lista de ramas probablemente será muy larga, la mayoría de las cuales ya no son necesarias.
En caso de que deba eliminarse, ¿qué pasará con su historial? ¿Se mantendrá eso, aunque la rama real ya no esté disponible? Además, ¿cómo eliminaría una rama remota?
fuente
Respuestas:
Puede eliminar con seguridad una rama con
git branch -d yourbranch
. Si contiene cambios no fusionados (es decir, perderías confirmaciones al eliminar la rama), git te lo dirá y no lo eliminará.Por lo tanto, eliminar una rama fusionada es barato y no te hará perder ningún historial.
Para eliminar una rama remota, use
git push origin :mybranch
, asumiendo que su nombre remoto es origen y que la rama remota que desea borrar se llama mybranch.fuente
master
, por lo que hace las cosas mucho más limpias.--no-merged
el predeterminado? Lo intentégit config --global --add branch.noMerged true
y se agregó, pero no hizo ninguna diferencia.Lo que debe hacer es etiquetar todo lo que suelte. Mantenga ramas alrededor para cuando esté desarrollando activamente.
Eliminar ramas viejas con
Eliminarlos del servidor con
o la sintaxis anterior
que se lee como "no insertar nada en branch_name en origen".
Dicho esto, mientras el DAG (gráfico acíclico dirigido) pueda señalarlo, los commits estarán allí en la historia.
Google "git-flow" y eso puede dar más información sobre la gestión de lanzamiento, ramificación y etiquetado.
fuente
Dado que la pregunta tiene la etiqueta "github", también agregaría esto: específicamente en Github , si solicita una rama y se fusiona (ya sea a través de la interfaz de usuario o fusionando la rama de la solicitud de extracción), no lo hará perderá los datos de la 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 combina muy bien con las revisiones de código), puede eliminar ramas de forma segura tan pronto como se fusionen. Esto es tan común que recientemente Github agregó una característica (dulce) que muestra un botón de "eliminar rama" justo después de combinar una solicitud de extracción.
Pero vale la pena notar que cada grupo debe adoptar el flujo de trabajo que más le convenga (y puede llevar o no a eliminar tales ramas). Mi equipo de trabajo actual, por ejemplo, poda todas las ramas que no están relacionadas con el maestro o la implementación (por ejemplo, producción, puesta en escena, etc.) tan pronto como se fusionan sus solicitudes de extracción, y todavía tenemos un seguimiento completo de cómo se formaron los compromisos relacionados cada mejora incremental de cada producto.
Por supuesto, ninguna gestión del 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 estén 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 ser eliminada, y que cualquiera que esté fusionado con una etiqueta de versión, "producción", etc., no debe , siempre tendrá las revisiones activas hasta que se integren en una versión futura.
fuente
Agregaría que la desventaja de eliminar ramas es que romperá cualquier hipervínculo a esas ramas en GitHub (esta pregunta está etiquetada como github). Obtendrá un
404 Not Found
error para esos enlaces. Es por eso que cambio mis enlaces para que apunten a una confirmación 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 los hipervínculos a las ramas de GitHub por completo y los enlaces a una confirmación o etiqueta desde el primer día.
Prefiero eliminar 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 todos los tenedores del repositorio.
Primero borro mi sucursal local. Esto evita que sea empujado accidentalmente más tarde.
Luego elimino la rama de seguimiento remoto
Luego borro la rama en GitHub. Yo uso la interfaz web, pero el comando equivalente está debajo.
Incluso si la rama nunca se fusiona, normalmente me gustaría mantener los compromisos para la posteridad. Sin embargo, todavía me gusta eliminar la rama. Para distribuir los commits y evitar que el recolector de basura los coma, hago una etiqueta anotada que apunta al mismo commit que la rama eliminada.
Luego empujo la etiqueta a github
fuente
Parece que desea eliminar la
2011_Hotfix
rama sin perder su historial. Discutiré la eliminación primero y la historia después.Los
git
métodos habituales de eliminación de ramas ya se han descrito anteriormente y funcionan como se esperaba.git
no tiene un comando de una o dos palabras que significa "Oyegit
, elimina tanto la rama local como la remota". Pero este comportamiento se puede imitar a través del script de shell. Por ejemplo, tome el script de shell de Zach Holman 'git-nuke' . Es muy simple:Ponga esto en un archivo ejecutable (por ejemplo,
git-nuke
) en uno de sus$PATH
directorios. Si no está en la2011_Hotfix
rama, simplemente ejecutandogit-nuke 2011_Hotfix
eliminará las ramas locales y remotas. Esto es mucho más rápido y sencillo, aunque quizás más peligroso, que losgit
comandos estándar .Su preocupación por preservar la historia es buena. En este caso, no debes preocuparte. Una vez que se fusionan
2011_Hotfix
enmaster
todos los commits de2011_Hotfix
se añadirán amaster
's se comprometen historia. En resumen, no perderá el historial 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 de todos modos es relevante. Imaginemos que hay 20 pequeños compromisos de "trabajo en progreso"
2011_Hotfix
; sin embargo, solo desea2011_Hotfix
que se agregue una confirmación completa almaster
historial de. ¿Cómo se combinan las 20 pequeñas confirmaciones en una gran confirmación? Afortunadamente, legit
permite consolidar múltiples confirmaciones en una confirmación mediante el usogit-rebase
. No explicaré aquí cómo funciona eso; sin embargo, si está interesado, la documentacióngit-rebase
es excelente. Tenga en cuenta quegit rebase
reescribe el historial, por lo que debe usarse con prudencia, especialmente si es nuevo en él. Finalmente, su2011_Hotfix
escenario es sobre un equipo de desarrollo, no un desarrollo en solitario. Si los miembros del equipo del proyecto usangit rebase
, es aconsejable que el equipo tenga pautas explícitas sobre el usogit rebase
para que algún desarrollador de vaqueros en el equipo no dañe involuntariamente lagit
historia de un proyecto .fuente
Si se fusionó con éxito nuevamente y tal vez incluso se etiquetó, diría que ya no tiene uso. Para que pueda hacerlo con seguridad
git branch -d branchname
.fuente
Si desea podar ramas locales que se han eliminado del origen, también puede podar, mientras usa
git fetch
fuente
Puede eliminar ramas 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
fuente