¿Cuándo es el momento adecuado para eliminar una rama de características de git?

88

No quiero terminar con 82 ramas de funciones dando vueltas , así que me pregunto cuáles son los posibles inconvenientes de eliminar simplemente la rama de funciones tan pronto como la fusione para dominar.

Flujo de trabajo:

git co -b feat-xyz
hack hack
git ci
hack some more
git ci
git co master
git merge feat-xyz
smoke test
git br -d feat-xyz

¿Algún problema aquí?

bstpierre
fuente
1
Yo diría que no hay problemas porque si realmente los necesita, siempre puede resucitar la rama eliminada más tarde.
slebetman
@slebetman Hasta donde yo sé, una rama eliminada no se puede resucitar. Sin embargo, si la rama se fusionó completamente con la maestra antes de eliminarla, ya no debería ser necesaria la rama.
Simeon
1
@Simeon Sí, puedes. Git nunca elimina las confirmaciones, por lo que cuando elimina su rama, simplemente elimina su nombre. Para resucitar una rama eliminada, solo necesita recordar lo último que comprometió con esa rama y puede buscarla git reflog. Entonces
echa un vistazo
@slebetman, eso solo será cierto si la rama se fusionó finalmente. Si las confirmaciones se quedan atrás, eventualmente se volverán inalcanzables y estarán sujetas a recolección de basura después de cierto tiempo. incluso las entradas en el reflog eventualmente se eliminarán, tiene aproximadamente 90 días por defecto.
goldenratio
@goldenratio: ¿Alguna referencia para eso?
slebetman

Respuestas:

61

Eliminar después de fusionar es la forma habitual. Es por eso que git branch -d yourbranchnameverifica para asegurarse de que la rama esté completamente fusionada antes de que se elimine.

Hay algunas razones en las que puedo pensar para mantener una sucursal: es posible que desee conservarla en caso de que vuelvan a aparecer errores una vez que llegue a producción, o es posible que desee un registro histórico.

En cualquier caso, tiene la opción de etiquetar el encabezado de la rama antes de eliminarlo. Una etiqueta es como una rama en el sentido de que es un puntero a una confirmación, excepto por algunas diferencias menores: 1) porcelain generalmente no muestra etiquetas en comandos exploratorios como git show-branch o tab-auto complete en el pago, 2) comprobar uno lo coloca en un HEAD independiente (no ref) 3) puede dejar un " mensaje de etiquetado ", que hace que la etiqueta se guarde como un objeto en el almacén de objetos como una confirmación.

De esta manera, preserva el historial, y si alguna vez necesita corregir un error, le recomiendo que cree una nueva rama del maestro para corregirlo.

albañil
fuente
1
Verificar una etiqueta establece HEAD, pero no crea automáticamente una rama. Un HEAD en una confirmación sin una rama es lo que lo hace separado.
Binarian
1
Tienes razón, establece HEAD en una identificación de confirmación en lugar de una referencia. Esa parte de mi OP es incorrecta. Debería actualizarlo.
masonk
96

Elimino después de la fusión, pero siempre hago una git merge --no-ff, para evitar el avance rápido para que el historial de la rama sea visible en el gráfico. Me gusta tener el historial de dónde se apartó la rama de funciones de la rama de desarrollo y dónde se unió:

Fusionar con o sin avances rápidos

Esto está tomado de Un exitoso modelo de ramificación de Git de Vincent Driessen, un flujo de trabajo muy agradable para usar con git que aplico para la mayoría de mis proyectos.

lkraider
fuente
Esta es otra buena forma de preservar el historial, porque puede seleccionar las confirmaciones a las que se puede acceder desde la función pero no desde el maestro: rev ^ 1..rev ^ 2. El lado negativo es que arruina cualquier rebase que pueda querer hacer desde su rama maestra (por ejemplo, si desea mantener el rebasado maestro en el control remoto ascendente, que es muy común).
masonk
1
Yo no tuve ese problema. Nuestro equipo se sincroniza a través de github, y normalmente no necesito reajustar, pero no creo que sea un inconveniente aquí. Incluso si reajusta su rama de desarrollo y características, la ramificación permanece visible en el gráfico, y lo que importa es lo que hay en la rama de características en relación con el desarrollo, no la confirmación donde partió originalmente cuando creó esa rama.
lkraider
@Ikraider, gracias por el recordatorio. Vi ese artículo cuando estaba aprendiendo git por primera vez, ahora tiene más sentido para mí. Reorganizo mis ramas de características, pero merge --no-ffvuelvo a master porque, como dices, puedes ver el historial.
bstpierre
7

Puedo pensar en dos razones por las que es posible que desee mantener una rama de función por un tiempo:

  • Existe la posibilidad de que te lo devuelvan para que trabajes más en sentido ascendente.
  • Otros desarrolladores posiblemente quieran esa característica sin querer todo lo demás en master.

En la práctica, la mayoría de las veces, eliminar después de fusionar está bien.

Karl Bielefeldt
fuente
6

El flujo de trabajo típico será

 // Create new branch
 $ git checkout -b myfeature
 // and then do some changes and commit them

 // Switch to master branch
 $ git checkout master

 // Merge myfeature to master. --no-ff will always keep branch information.
 $ git merge --no-ff myfeature

 // Delete myfeature branch
 $ git branch -d myfeature

 // Push the changes
 $ git push origin master
Fizer Khan
fuente
1

Creo que ese es el flujo de trabajo típico (eliminar después de fusionar)

EDITAR Entonces, en lugar de fusionar, al menos para las ramas de corta duración, creo que la idea es volver a basarlas en el maestro. luego terminas con un historial de cambios lineal y toda la rama se convierte en parte del tronco principal. en este caso, tiene todos los cambios allí, por lo que claramente no necesita una copia.

segundo
fuente
Entonces, realmente no tiene sentido mantener la rama alrededor, ¿verdad?
bstpierre
1
Recomiendo encarecidamente evitar "rebase". Rebasar es generalmente dañino, solo útil en algunos casos.
Dietrich Epp
9
Rebasar es un flujo de trabajo perfectamente razonable para sus sucursales privadas locales. Es muy común mantenerse sincronizado con el trabajo anterior, por ejemplo, reajustando ("reajustado hacia abajo "). Es mucho menos común, y generalmente dañino, reajustar *. La respuesta del segundo realmente no tiene sentido, porque ya sea que esté reajustando o fusionando cambios ascendentes, todavía tiene que empujar esas cosas "hacia arriba" de alguna manera. Incluso en su sucursal local, tendrá que fusionar su función para dominar en algún momento. La ventaja de seguir basándose en sus características es que esta fusión avanza rápidamente.
albañil
1
Sin embargo, hay algo que tener en cuenta con el rebase de las ramas, lo que me mordió recientemente. Ahora es obvio, pero pasé meses en una rama de larga duración, siempre rebasando todo contra el maestro. Terminó con alrededor de 600 confirmaciones granulares agradables, pero el maestro se había refactorizado y cambiado por completo muchas veces. Al rebasar toda la rama cada vez, estaba cortando sus confirmaciones más antiguas de su conexión con las confirmaciones maestras que tenían sentido para ellos. Ahora prefiero fusionarme en master cuando sea necesario. Solo cambiaré la base si el historial de la rama no se verá afectado en absoluto.
Gary Fixler