git - remove - ¿Los registros deben ser pequeños pasos o características completas?
git remove tag (7)
Dos usos del control de versiones parecen dictar diferentes estilos de registro.
Centrado en la distribución : los conjuntos de cambios generalmente reflejarán una característica completa. En general estos checkins serán mayores. Este estilo es más fácil de usar / mantener.
centrada en la reversión : los conjuntos de cambios serán pequeños pasos individuales para que el historial pueda funcionar como un deshacer increíblemente poderoso. En general estos checkins serán más pequeños. Este estilo es más amigable para los desarrolladores.
Me gusta usar mi control de versiones como un deshacer realmente poderoso mientras que me ataco a un código / error persistente. De esta manera, no tengo miedo de hacer cambios drásticos para probar una posible solución. Sin embargo, esto parece darme un historial de archivos fragmentado con muchos registros "bien que no funcionaron".
Si, por el contrario, trato de que mi conjunto de cambios refleje características completas, pierdo el uso de mi software de control de versiones para la experimentación. Sin embargo, es mucho más fácil para los usuarios / mantenedores descubrir cómo está evolucionando el código. Lo que tiene grandes ventajas para revisiones de código, manejo de múltiples sucursales, etc.
Entonces, ¿qué debe hacer un desarrollador? Checkin pequeños pasos o características completas?
Entonces, ¿qué debe hacer un desarrollador? checkin pequeños pasos o características completas?
Es posible obtener lo mejor de ambos mundos, especialmente con git
y otros DVCS que le permiten ser selectivo sobre qué historia publicar. Aquí hay un flujo de trabajo simple que ilustra esto.
Tu proyecto tiene ramas maestras y de lanzamiento . Cada desarrollador mantiene su propio desarrollo de ramas que no presionan.
Usas el desarrollo para hacer tu trabajo diario. Aquí aparecen confirmaciones de tamaño de mordida, que representan avances incrementales en el estado del proyecto a lo largo del tiempo. Puede crear ramas de tema * para trabajar en funciones más largas que abarquen más de unos pocos días o refactorizaciones importantes. Te comprometes a desarrollarte con mucha frecuencia, tal vez varias veces por hora. Es como presionar "Guardar" en un documento que estás editando.
Cuando tiene algunas confirmaciones adecuadas para la próxima versión, debe combinar las confirmaciones relevantes para liberar . release ahora tiene un montón de confirmaciones individuales que se han tomado de forma selectiva de su rama de desarrollo . Te comprometes a liberar cuando llegues a un buen punto de parada. Eso suele ser un par de veces al día.
Cuando el lanzamiento está listo para su uso, su desarrollador principal aplasta todos los confirmaciones desde la última fusión para dominar en una sola confirmación de fusión que aparece en el maestro . Luego etiqueta este compromiso con el identificador de la versión (por ejemplo, v.1.0.4). Esto sucede con poca frecuencia, tal vez una vez por iteración o cada pocas semanas.
Aquí, puedes tener tu pastel y comerlo también. Antes de la liberación, puede deshacer los cambios que no deberían haber ocurrido o que no desea incluir en el lanzamiento, y puede hacerlo uno por uno. Desarrollador amigable! Pero los usuarios también obtienen lo que quieren: grandes, globby se compromete en el master que representan lo que ha cambiado desde la última versión.
La belleza de los sistemas DVCS es que puede tener ambos , ya que en un DVCS a diferencia de un CVCS, la publicación es ortogonal para cometer . En un CVCS, cada confirmación se publica automáticamente, pero en un DVCS, las confirmaciones solo se publican cuando se envían.
Por lo tanto, cometer pequeños pasos, pero solo publicar características de trabajo.
Si le preocupa contaminar su historial, puede reescribirlo. Es posible que haya escuchado que reescribir la historia es mala, pero eso no es cierto: solo reescribir la historia publicada es mala, pero nuevamente, dado que publicar y cometer son diferentes, puede reescribir su historia sin publicar antes de publicarla.
Así es como funciona el desarrollo de Linux, por ejemplo. Linus Torvalds está muy preocupado por mantener la historia limpia. En uno de los primeros correos electrónicos sobre Git, dijo que la historia publicada no debería parecer que realmente la desarrollaste, sino cómo la habrías desarrollado, si fueras omnisciente, podrías ver el futuro y nunca cometer errores. .
Ahora, Linux es un poco especial: se compromete a una tasa de 1 cada 11 minutos durante las 24 horas del día, los 7 días de la semana, los 365 días del año, incluidas noches, fines de semana, días festivos y desastres naturales. Y esa tasa sigue aumentando. Imagínese cuánto más compromisos habría si cada error tipográfico y un fallo en el cerebro resultaran también en un compromiso.
Pero los propios desarrolladores en sus repositorios privados se comprometen como a menudo quieren.
La mayoría de las veces puedo salirme con la siguiente regla de oro: verifique la cantidad más pequeña en un momento que tenga sentido (y aún así sea útil o una mejora). Me parece que esto me ayuda a planificar mejor mi trabajo, que tiene varios beneficios que incluyen (pero no se limitan a) ...
- Mejores estimaciones de desarrollo.
- Mejores estimaciones de prueba.
- Tiempo de desarrollo más rápido.
- Menos errores en general.
- Menos acoplamiento entre módulos.
- Descubrir antes si mi código rompió algo más involuntariamente.
- mucho mas
Sin embargo, hay veces en que es necesario crear una rama y luego, cuando se realiza el trabajo, fusionarlo de nuevo en la línea principal. Sin embargo, una vez que estoy operando en la sucursal, todavía trato de seguir la regla, ya que renuncia automáticamente a todos esos beneficios.
Espero que esto ayude.
Mi recomendación sería crear una sucursal o incluso un repositorio separado para fines de experimentación. Luego, una vez que se completa la función, puede volver a combinar el código de la rama en el tronco principal del código. Con suerte, eso te permitirá tener lo mejor de ambos mundos.
Pasos pequeños. Hay una razón por la que se llama control de revisión , y no control de liberación :)
Comprométete tantas veces como quieras. No te detengas. Nunca debe haber consecuencias negativas al cometer código en una rama "en progreso". Las tiendas de desarrollo que esperan que se comprometan a no "romper la construcción" están abusando del RCS. Del mismo modo, atribuir cualquier significado a un compromiso es una política peligrosa, simplemente porque entra en conflicto con el propósito del control de revisión. En su lugar, el significado debe atribuirse a etiquetas, ramas, clones, escondites, o como lo llame su RCS. Estas cosas tienen metadatos (tal vez tan mínimos como un nombre ) diseñados para transmitir el propósito. Las revisiones son simplemente una historia de lo que modificaste.
Lo último que desea hacer es instituir una política para disuadir a los desarrolladores de que no ingresen su código, por cualquier motivo.
Una cosa que realmente me gusta de Git es que el repositorio en tu desarrollador. El medio ambiente es tu repo. Es una copia del repositorio del mantenedor. Usted es libre de hacer lo que quiera para ese repo y no marcará al mantenedor a menos que presente algunas historias locas.
Para ese punto, use la ramificación y la fusión en su beneficio tanto como pueda para ayudar en su desarrollo y experimentación. Solo presiona los cambios con los que te sientas más cómodo en el sentido ascendente. Git incluso le da la posibilidad de aplastar su historial de compromisos en menos conjuntos de cambios si es necesario para que pueda aumentar una serie de compromisos que realizó en un solo compromiso.
La flexibilidad es extremadamente poderosa para su flujo de trabajo personal, así como las políticas que sus colegas tienen vigentes.
Los pequeños pasos son realmente grandes. Siempre puedes agruparlos en pasos más grandes en otro repositorio. Para hacer lo contrario, tiene que "reescribir el historial", lo que se puede hacer en algunos sistemas (especialmente git), pero no está tan bien soportado como le gustaría.
Otra razón por la que me gustan los pasos pequeños es para que mis colegas puedan ver fácilmente lo que he hecho. Si trabajo durante tres o cuatro horas, a menudo es mucho más sensato que recorte media docena de confirmaciones para que mis colegas puedan ver las diferencias relevantes. (Y aprecio que me extiendan la misma cortesía.)
Finalmente, los pequeños pasos hacen que sea menos probable que tenga conflictos, o que cuando los tenga, serán más pequeños.
Utilizo pequeños pasos incluso cuando trabajo solo, en varias ramas.
Resumen: Para el flujo de trabajo diario, los pasos pequeños tienen muchas ventajas. Si desea un flujo de trabajo centrado en la distribución, cree un repositorio y una sucursal solo para la distribución, y puede configurar sus grandes pasos allí exactamente como lo desea.