Del libro de Git SCM :
A menudo, cuando ha estado trabajando en parte de su proyecto, las cosas están en un estado desordenado y desea cambiar las ramas por un tiempo para trabajar en otra cosa. El problema es que no desea realizar una tarea de trabajo a medias para poder volver a este punto más adelante. La respuesta a este problema es el comando git stash.
Stashing toma el estado sucio de su directorio de trabajo, es decir, sus archivos rastreados modificados y los cambios por etapas, y lo guarda en una pila de cambios sin terminar que puede volver a aplicar en cualquier momento.
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.
- Crear nueva sucursal
- Piratear piratear piratear
- Cometer código roto
- Pulir el código y hacerlo funcionar
- Confirmar código de trabajo
- Rebase y Squash
- Prueba
- Empuje cuando las pruebas pasan
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:
En primer lugar, un alijo no está fuera de un "flujo de trabajo de ramificación" ya que debajo del capó un alijo es solo otra rama.
(a riesgo de provocar la ira de muchas personas)
Linus dijo:
Con "git stash", también puedes tener varias cosas escondidas diferentes, pero no se ponen en fila entre sí, son solo parches independientes aleatorios que has guardado porque eran inconvenientes en algún momento.
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 de git stash
eso es el problema. Es la combinación de comprometerse a dominar y usar git stash
. Este es un anti patrón.
Aclarando git rebase
Del comentario de @ RibaldEddie:
Rebasar es mucho más como copiar y pegar y, lo que es peor, modifica el historial comprometido.
(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:
Quiero un historial limpio, pero eso realmente significa (a) limpio y (b) historial.
Las personas pueden (y probablemente deberían) volver a crear sus árboles privados (su propio trabajo). Eso es una limpieza . Pero nunca el código de otros pueblos. Eso es un "destruir historia"
Entonces la parte de la historia es bastante fácil. Solo hay una regla principal y una aclaración menor:
Nunca debes destruir la historia de otras personas. No debes rebajar los compromisos que hicieron otras personas. Básicamente, si no tiene su cierre de sesión, está fuera de los límites: no puede modificarlo, porque no es suyo.
Tenga en cuenta que esto realmente se trata de la historia de otras personas , no del código de otras personas . Si te enviaron cosas como un parche enviado por correo electrónico y lo aplicaste con "git am -s", entonces es su código, pero es
tu historial.
Por lo tanto, puede volverse loco con el tema "git rebase", aunque no haya escrito el código, siempre que el commit en sí sea privado.
Aclaración menor a la regla: una vez que haya publicado su historial en un sitio público, otras personas pueden estar usándolo, y ahora claramente ya no es su historial privado .
Entonces, la aclaración menor realmente es que no se trata solo de "su compromiso", también se trata de que sea privado para su árbol, y aún no lo ha rechazado y anunciado.
...
Ahora la parte "limpia" es un poco más sutil, aunque las primeras reglas son bastante obvias y fáciles:
Mantenga su propia historia legible
Algunas personas hacen esto simplemente resolviendo las cosas primero y sin cometer errores. pero eso es muy raro, y para el resto de nosotros, usamos "git rebase", etc., mientras trabajamos en nuestros problemas.
Entonces "git rebase" no está mal. Pero es correcto solo si es TU PROPIO árbol git privado.
No expongas tu basura.
Esto significa: si todavía está en la fase de "git rebase", no lo expulsa. Si no está listo, envía parches o usa árboles git privados (como un "reemplazo de la serie de parches") que no le cuenta al público en general.
(énfasis mío)
Conclusión
Al final, el OP tiene algunos desarrolladores que hacen esto:
git checkout master
(edit files)
git commit -am "..."
(edit files)
git stash
git pull
git stash (pop|apply)
Hay dos problemas aquí:
- Los desarrolladores se comprometen a dominar. Bloquee esto de inmediato. Realmente, este es el mayor problema.
- Los desarrolladores usan constantemente
git stash
y git 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 usarlo git 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.