Recientemente he estado viendo cómo mi equipo y yo usamos Git y cómo funcionan nuestros flujos de trabajo. Actualmente utilizamos un flujo de trabajo de rama de características que parece funcionar bien.
También he visto a algunas personas en nuestro equipo usar el flujo de trabajo basado en git stash . El flujo de trabajo es más o menos así:
- Trabajar en una rama principal (como
master
) - Haz compromisos a medida que avanzas
- Si necesita obtener cambios o cambiar ramas, empuje sus cambios no confirmados al alijo
- Una vez que haya realizado la actualización, elimine los cambios del alijo.
Debo mencionar que este flujo de trabajo se usa en lugar de un flujo de trabajo de rama de características. En lugar de tomar una rama y trabajar en ella, los desarrolladores aquí solo trabajan en una sola rama y empujan / salen de la pila como mejor les parezca.
De hecho, no creo que este sea un gran flujo de trabajo, y la ramificación sería más apropiada que usar git stash de esta manera. Puedo ver el valor de git stash como una operación de emergencia, pero no para usarlo en un flujo de trabajo diario y regular.
¿Usar git stash regularmente se consideraría un antipatrón? Si es así, ¿cuáles son algunos problemas específicos que podrían surgir? Si no, ¿cuáles son los beneficios?
If you need to get changes or switch branches, push your uncommitted changes onto the stash
- para eso es exactamente el alijo.Respuestas:
Del libro de Git SCM :
Dada esta descripción, diría que este es un Anti Patrón. Una explicación demasiado simplificada de Git Stash sería que es el "Cortar y Pegar" del control de código fuente. Usted toma un montón de archivos modificados, los "guarda" en un bolígrafo fuera del flujo de trabajo de ramificación normal de Git, y luego vuelve a aplicar esos cambios a una rama diferente en una fecha posterior.
Retrocediendo un poco más, comprometerse a dominar es el anti patrón aquí. Usa ramas. Para eso fueron diseñados.
Realmente se reduce a esto:
Puede clavar un tornillo en la pared y sostendrá una imagen, pero usar un destornillador es lo que debe hacer. No use un martillo cuando el destornillador esté sentado a su lado.
Acerca de cometer un código "roto"
Si bien lo siguiente es opinión, he llegado a esta opinión por experiencia.
Comprometerse temprano y comprometerse a menudo. Comete tanto código roto como quieras. Vea su historial de confirmación local como "puntos de guardado" mientras piratea algo. Una vez que hayas hecho un trabajo lógico, haz un compromiso. Claro que puede romper todo, pero eso no importa siempre y cuando no empujes esas confirmaciones. Antes de empujar, rebaja y aplasta tus commits.
Para el OP, este hilo de mensajes kernel de Linux podría ser de interés, porque parece que algunos miembros del equipo del OP están usando Git de manera similar.
@RibaldEddie dijo en un comentario a continuación:
(a riesgo de provocar la ira de muchas personas)
Linus dijo:
Lo que creo que @RibaldEddie está tratando de decir es que puedes usarlo
git stash
en un flujo de trabajo de rama de características, y esto es cierto. No es el uso degit stash
eso es el problema. Es la combinación de comprometerse a dominar y usargit stash
. Este es un anti patrón.Aclarando
git rebase
Del comentario de @ RibaldEddie:
(El énfasis es mío)
Modificar el historial de confirmación no es algo malo, siempre y cuando sea un historial de confirmación local . Si modifica las confirmaciones que ya ha presionado, esencialmente huérfano a cualquier otra persona que use su rama. Esto es malo.
Ahora, digamos que ha realizado varias confirmaciones durante el transcurso de un día. Algunas confirmaciones fueron buenas. Algunos ... no tan buenos. El
git rebase
comando junto con el aplastamiento de sus confirmaciones es una buena manera de limpiar su historial de confirmación local. Es bueno fusionarse en una confirmación con sucursales públicas porque mantiene limpio el historial de confirmación de las sucursales compartidas de su equipo. Después de cambiar el nombre, querrá volver a probar, pero si pasan las pruebas, puede empujar una confirmación limpia en lugar de varias sucias.Hay otro hilo interesante del kernel de Linux en el historial de confirmación limpio .
De nuevo, de Linus:
(énfasis mío)
Conclusión
Al final, el OP tiene algunos desarrolladores que hacen esto:
Hay dos problemas aquí:
git stash
ygit pull
en master cuando deberían usar ramas de características.No hay nada de malo en usarlo
git stash
, especialmente antes de un tirón, pero usarlogit stash
de esta manera es un anti patrón cuando hay mejores flujos de trabajo en Git.Su uso de
git stash
un arenque rojo. No es el problema Comprometerse a dominar es el problema.fuente
Personalmente, solo uso
stash
para interrupciones cortas e inesperadas, como alguien que hace una pregunta que requiere cambiar a una rama diferente. Hago esto porque me he olvidado de los escondites antes, luego no se aplicarían limpiamente. Los commits regulares en las ramas de características son mucho más difíciles de olvidar y más fáciles de fusionar, por lo que ahora tiendo a hacer un commit roto y luego hacer unagit reset HEAD~1
o una nueva versión si no quiero mantenerlo más tarde.Sin embargo, lo mejor del control de versiones distribuidas es que las personas pueden usar su flujo de trabajo preferido en sus propios repositorios, siempre que los repositorios compartidos cumplan con los estándares. Me aseguraría de que las personas no solo usen un
stash
flujo de trabajo porque no tienen suficiente capacitación o conocimiento de las alternativas, pero si aún eligen un flujo de trabajo que usted encuentra subóptimo, lo dejaría.fuente
Creo que la parte de su pregunta que es un antipatrón es el uso de una única rama maestra compartida . Sin embargo, si tuviera que incluir una rama de desarrollo además de la rama maestra y luego usar escondites para lidiar con sus propios cambios de contexto en la rama de desarrollo, eso no sería un antipatrón, y refleja muy bien parte del flujo de trabajo describir por organizaciones como Etsy y Facebook.
Dicho esto, la respuesta anterior de @Greg Burghardt es demasiado favorable para el llamado flujo de trabajo de git-flow o característica-rama. Solía abogar por una estrategia similar, pero después de darme cuenta de que agrega complejidad innecesaria y crea una falsa sensación de seguridad, ya no lo hago. También es un remanente de los días de los sistemas de control de versiones no descentralizados como la subversión.
En primer lugar, dado que Git es un sistema de control de versiones descentralizado a diferencia de Subversion, el repositorio local de un desarrollador es esencialmente una rama gigante del código en sí mismo. Lo que un desarrollo individual hace localmente no tiene y no debería tener un impacto en los otros miembros del equipo a menos que el código roto o defectuoso se envíe a las ramas compartidas en un repositorio compartido.
Sin embargo, el comando rebase puede dañar el historial de la rama cuando hay un conflicto de fusión en una de las confirmaciones reproducidas. De http://ryantablada.com/post/the-dangers-of-rebasing-a-branch
Además, un modelo de ramificación múltiple presupone que no hay dos ramas que puedan contener cambios de código interdependientes. Cuando eso ocurre inevitablemente, el desarrollador ahora tiene que hacer malabarismos con más ramas para trabajar de manera eficiente.
El antipatrón fundamental que veo no está relacionado con las ramas frente a los escondites, sino más bien sobre los tipos de problemas de los que algunas personas muy inteligentes han estado hablando durante un tiempo: ¿tiene confianza en su código mediante el uso de pruebas unitarias y una buena arquitectura? ¿Puede realizar cambios incrementales en su código de modo que sus desarrolladores puedan razonar sobre los cambios fácilmente y comprender qué hará un cambio? ¿Sus desarrolladores incluso corren a través del nuevo código una vez para ver si realmente funciona? (Sí, he visto esto antes).
Si la respuesta a esas preguntas es no, entonces realmente no importa cuántas ramas tenga; los desarrolladores dirán que el código está listo, funciona y es apto para la producción cuando realmente no lo está, y no habrá un número de ramas. ayudarlo cuando ese código pase a producción de todos modos.
fuente
git stash
es una herramienta En sí mismo no es un patrón ni un antipatrón. Es una herramienta, al igual que un martillo es una herramienta. Usar un martillo para clavar clavos es un patrón y usar un martillo para clavar tornillos es un antipatrón. Del mismo modo, hay flujos de trabajo y entornos dondegit stash
es la herramienta correcta para usar, y flujos de trabajo y entornos donde está mal.El flujo de trabajo de 'todos se comprometen y empujan a la línea principal' es uno que funciona de manera bastante razonable donde no hay cambios de alto riesgo. A menudo se usa en entornos svn donde hay un servidor central autorizado que tiene el código.
Sin embargo, Git se une para eliminar el único servidor central. Tener a todos los desarrolladores haciendo
commit
,pull
(orebase
si te gusta eso),push
todo el tiempo puede hacer un gran desastre.Los mayores problemas surgen cuando tienes algo en progreso que está roto y necesitas trabajar en un error de prioridad. Esto significa que debe dejar de lado ese trabajo por un momento, tomar lo último, trabajar en eso sin que el trabajo anterior en progreso cause problemas con la compilación que está tratando de hacer.
Para esto,
git stash
sería la herramienta adecuada para usar.Sin embargo, hay un problema mayor que acecha en el corazón de este flujo de trabajo. Es que todos los roles de las ramas de control de versiones están en una sola rama. Mainline, desarrollo, mantenimiento, acumulación y empaque están en Master. Esto es un problema (Consulte Estrategias avanzadas de ramificación SCM para obtener más información sobre este enfoque de sucursales)
Y sí, usted dijo que no es un gran flujo de trabajo y que hay problemas con él. Sin embargo, el problema no es con la herramienta
git stash
. El problema es la falta de ramificaciones distintas para roles o políticas incompatibles .git stash
sin embargo, es algo que utilicé cuando tuve una situación en la que construí un poco, me puse en un estado pegajoso que no estaba seguro de si era el correcto ... así que escondí mis cambios y luego exploró otro enfoque para resolver el problema. Si eso funcionó, genial, deseche las cosas en el alijo y continúe. Si la otra exploración se volvió más pegajosa, reinicie el cambio anterior y vuelva a aplicar el alijo para trabajar en eso. La alternativa sería confirmar, finalizar la compra, bifurcar y luego continuar en esta nueva bifurcación o volver y restablecerla. La pregunta es si realmente vale la pena poner eso en la historia cuando es algo que quiero explorar un poco.git stash
No es un anti patrón. Usarlogit stash
como una alternativa a la ramificación mientras todos se comprometen con el Maestro es un anti patrón, pero no por esogit stash
.Si aún no lo ha alcanzado, solo espere hasta que tenga problemas con las compilaciones , cuando alguien necesite realizar cambios arquitectónicos significativos en muchos archivos (y los conflictos de fusión) o algún código de trabajo en progreso no probado que se filtre a producción para esto. antipatrón para ponerte al día.
fuente