Eliminación de rama de Git

79

En Git, ¿qué significa "eliminación" de una rama?

¿Se habrá ido del repositorio? ¿O todavía será navegable a través degit branch ?

Lo que realmente quiero hacer es marcar una rama como "callejón sin salida", es decir, la rama está tan lejos de la maestra, que nadie debería usarla como punto de partida, aunque hubo algunas buenas ideas en esa rama, así que Me gusta conservarlo, como referencia.

bobobobo
fuente

Respuestas:

157

Puede eliminar la rama, pero etiquetarla primero, para que su historial no desaparezca. De esta manera, la rama no aparece en la lista de ramas, lo que con suerte debería disuadir a las personas de trabajar en ella, pero el trabajo no se borrará permanentemente (incluso después de que se ejecute la recolección de basura). Por ejemplo, cada vez que tengo una rama que se ha vuelto irrelevante, pero no estoy preparado para eliminarla permanentemente, la etiqueto como "archive / < nombre-rama >".

Mientras está en mastero en alguna otra rama:

git tag archive/foo foo
git branch -D foo

Esto crea una etiqueta con el nombre archive/foode la foorama antes de eliminarla foo. También puede agregar un mensaje a la etiqueta, que explique qué hay en la rama, por qué existía, por qué ahora es un callejón sin salida, etc.

git tag -m 'Foo is deprecated in favor of bar' archive/foo foo

La capacidad de registrar por qué una rama está en desuso es quizás una ventaja de etiquetar frente a mover ramas a un espacio de nombres alternativo.

Si alguna vez necesita resucitar una rama que se ha archivado de esta manera, es tan simple como:

git branch foo archive/foo
git tag -d archive/foo       # Optional

Ahora la rama está de regreso como si nunca se hubiera eliminado.

Moldeo Dan
fuente
5
@sardaukar: Esto también puede funcionar con repositorios remotos presionando la etiqueta de archivo (usando la --tagsopción para git push) y luego eliminando la rama remota (usando :<branch-to-delete>refspec mientras presiona). Por ejemplo:git tag archive/foo foo; git branch -D foo; git push --tags origin :foo
Dan Moulding
Sería bueno si git tuviera una forma de informar automáticamente a las personas "esta rama ha sido archivada" y mostrar el mensaje de confirmación, si la gente intentara extraer de una rama archivada, pero no es así.
Robin Green
1
Muy buena respuesta, ¡exactamente lo que estaba buscando! Solo para estar seguro, ¿es útil si la rama se ha fusionado con el maestro antes de ser eliminada?
claf
Otra pregunta relacionada (si alguien todavía sigue este hilo) es ¿cómo debo "cerrar" (fusionar en maestro o archivo en una etiqueta o lo que sea) si hay varios desarrolladores involucrados en esta rama? ¿Eliminar y etiquetar la rama (tanto local como remota) no es demasiado grosero para otros desarrolladores de esta rama?
claf
1
esta respuesta es una solución excelente y brillante
Christopher Thomas
2

Las ramas de Git se almacenan como referencias a una revisión. Si elimina la rama, se elimina la referencia; si nada más hace referencia a esa revisión, eventualmente será recolectada como basura. Además, si elimina la rama, entonces se ha ido correctamente (de su repositorio). Si desea marcar una rama como obsoleta pero conservarla para usarla más adelante, puede mover la rama a un subdirectorio:

$ git branch
* master
  testing_feature_one
  testing_feature_two
$ git branch -m testing_feature_one deprecated/testing_feature_one
$ git branch
  deprecated/testing_feature_one
* master
  testing_feature_two

Alternativamente, puede crear un repositorio separado para las ramas en desuso, extraerlas y eliminarlas del original. En cualquier caso, afectará a cualquier usuario que esté siguiendo las ramas; el contenido de su repositorio no cambiará (ni tampoco ninguno de los nombres de sus ramas), pero si intentan extraer de nuevo, lo harán tienen que cambiar su objetivo en su configuración.

Andrew Aylett
fuente
2

git branch -D <branchName>eliminará su rama del repositorio. Ya no podrá verlo ni navegar. Además, perderá todos los cambios de archivo realizados en esa rama.

https://git-scm.com/docs/git-branch

Stewie Griffin
fuente
0

No será navegable a través de git branch y hasta que no se realice la recolección de basura, no se perderá del repositorio.

Si desea marcar la rama en cuestión como un callejón sin salida, simplemente hágalo (es posible que git no lo haga por usted, pero ciertamente puede hacerlo).

Etiquetándolo (de la forma que prefiera) como obra de referencia histórica.

Código falso Monkey Rashid
fuente