git workflow: mantener un historial de confirmaciones funcionales

¿Cuál es la mejor manera de mantener un historial de versiones funcionales de su repository de git ?

Es tan fácil ramificarnos y fusionarnos en git que lo hacemos todo el time. En general, me he acostumbrado a usar twigs temáticas, solo fusionándome en el maestro cuando se completa una característica. Esto funciona bien, pero después de varias iteraciones, el historial de su twig principal es un gráfico intrincado y se vuelve muy difícil identificar las confirmaciones que representan una versión de su aplicación que funciona correctamente en cualquier momento.

Estoy buscando asesoramiento sobre un flujo de trabajo que me permita recuperar fácilmente una copy de trabajo (es decir, no en el medio de desarrollar una function) de mi repos más cercano a una date específica. Otra característica útil de esto sería recuperar una list de confirmaciones que representan un repository en funcionamiento que cambia con el time.

Me doy count de que esto se puede hacer manualmente, es decir, examinar el logging y los posts de confirmación para encontrar el último compromiso justo antes de que se inicie la siguiente característica, o ejecutando el set de testings contra cada confirmación y filter. Esos methods serían algo confiables, pero estoy buscando una forma less aleatoria de hacerlo.

Puede usar git log --first-parent master para ver un historial de maestro, siguiendo solo el primer padre de cada confirmación. Esto significa que cuando se encuentra una fusión, solo se sigue el primer padre (que debería ser la confirmación anterior en el maestro), y el segundo padre (el último compromiso en la twig del tema) se ignora. Con su flujo de trabajo, esto probablemente consistirá principalmente de fusiones. El punto importante es que, siempre que se considere que una confirmación (o combinación) realizada en el maestro es una versión en funcionamiento, cada una de las confirmaciones en este logging es una versión que funciona.

Estoy muy contento de oírte usando twigs de características: vete 🙂

Después de eso, hay dos maneras de mantener las cosas orderadas, y una cosa que solo ayuda a que tu cerebro funcione mejor.

1) Para cada sucursal en la que estés trabajando activamente, crea una sucursal local. Desea hacer esto porque quiere poder volver a establecer la base de lo que hacen los demás. Sin la rebase tendrás un montón de commits que representan fusiones que realmente no agregan nada al historial. Puede volver a establecer la base de la twig que es remota, sin embargo, esto se desaconseja, ya que el reescribir reescribe el historial, y dos personas deberían hacerlo al mismo time, se pone peludo y es muy difícil de seguir. Al principio de los proyectos, suelo trabajar fuera de master . Así que creo un master_local que no rastrea nada (git branch master_local). Cuando la gente hace cambios que quiero o necesito (git pull), mientras tengo master_local desprotegido, simplemente rebase (git rebase master).

Y la sugerencia para mantener su cerebro funcionando bien: combine su sucursal local en la twig de seguimiento / function remota a menudo. Cuanto más time mantenga las cosas separadas, más tendrá que recordar, cuanto mayor sea su fusión, más se quejarán los demás de que no está trabajando, etc.

2) Si tiene funciones grandes y muchas personas, tendrá toneladas de confirmaciones por twig de características. Una vez que estas características están lists para dominar, no es necesario que las vea todas. Y si desea revertir la característica, no desea revertir varios cientos de parches. La respuesta a todo esto es aplastar sus compromisos hasta 1 compromiso único. Esta forma maestra es una buena y breve list de las características que contiene. (http://www.gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html)

Creo que la mejor solución (a largo ploop) sería adaptar su flujo de trabajo, para mantener su twig principal limpia de compromisos de 'punto de control' intermedios. Benjamin Sandofsky detalla un flujo de trabajo que parece estar más cerca de la forma en que fue diseñado Git.

La esencia del artículo:

Piense en las twigs en dos categorías: pública y privada.

Las twigs públicas son la historia autorizada del proyecto. En una sucursal pública, cada compromiso debe ser sucinto, atómico y tener un post de compromiso bien documentado. Debe ser lo más lineal posible. Debe ser inmutable. Las twigs públicas incluyen twigs Maestra y de lanzamiento. Una sucursal privada es para usted. Es su papel de borrador mientras resuelve un problema.

Los misterios de la tirita no-ff, la bisección rota y la culpa son síntomas de que estás usando un destornillador como martillo.

Nunca debe fusionar una sucursal privada directamente en una sucursal pública con una combinación de vanilla. Primero, limpia tu sucursal con herramientas como restablecer, rebase, squash merge, y cometer modificaciones. Si tratas tu historia pública como prístina, las fusiones rápidas no solo son seguras sino también preferibles. Mantienen el historial de revisión lineal y más fácil de seguir.

Trate la historia pública como inmutable, atómica y fácil de seguir. Trate la historia privada como desechable y maleable.

El flujo de trabajo previsto es:

  1. Crea una sucursal privada en una sucursal pública.
  2. Regularmente comprometa su trabajo a esta twig privada.
  3. Una vez que tu código sea perfecto, limpia su historial.
  4. Combina la twig limpia en la twig pública.