tipos tag remove practices etiquetas crear best git svn merge merge-conflict-resolution feature-branch

remove - git tag best practices



Backporting de características en Git/Subversion (3)

Depende. Si la característica crítica es relativamente simple y pequeña, puede hacer varias selecciones de cereza. Sin embargo, por supuesto, podría causar una gran cantidad de conflictos de fusión, ya que la implementación de la función podría utilizar el código refactorizado. Sin embargo, según tengo entendido, será la solución más fácil. Y la única solución para SVN.

Sin embargo, esta solución no refleja las acciones en el gráfico de historial, confunde.

Con git hay otra opción para volver a establecer la base de la función crítica en la merge-base de merge-base de las ramas master y release-2.0.x . Literalmente significa que debes volver a implementar la función usando el código anterior, que es común para ambas ramas. En este caso, podría fusionar la función rebasada. Si ya fusionó la característica con el maestro, cuando fusionaría la función reestadificada en el maestro, probablemente entraría en conflicto (ya que el maestro ya tiene dicha implementación). Entonces resolverás conflictos, sin embargo, en la mayoría de los casos será fácil, porque los cambios deberían ser casi los mismos.

Lo bueno del enfoque basado en funciones rebasadas es que si encuentra un error en él, puede arreglarlo en la rama de características y fusionar fácilmente las correcciones en el lanzamiento y las ramas principales.

Por supuesto, la nueva configuración podría causar una gran cantidad de conflictos, pero significa que no hay una forma fácil de respaldar la función en la release-2.0.x Tal vez sería más fácil simplemente volver a implementarlo en ese momento.

¿Cuál sería la forma preferida de lograr el siguiente flujo de trabajo con Git o Subversion (tengo más interés en la versión de Git , pero la comparación definitivamente será útil):

  • Digamos que tuvimos un lanzamiento importante del producto recientemente y hay una rama polisihin específica llamada release-2.0.x .

    El desarrollo luego continuó y varias ramas de características se fusionaron en el master/trunk (más tarde se convertirán en parte de la próxima release-2.1.x ).

  • Ahora, en algún momento, se desarrolló y se fusionó otra característica (a saber, critical-feature ) con el master/trunk . Nos damos cuenta de que esta característica es tan importante, que debemos respaldarla con release-2.0.x .

Aquí hay una pequeña ilustración pseudográfica para el caso descrito. Tenga en cuenta que todo en la parte superior trae diferencias de árbol entre release-2.0.x y master/trunk actual y conduce a problemas de fusión (de lo contrario, simplemente podría fusionar la función critical-feature y evitar escribir esta pregunta :)

(features added since 2.0.x, which should not be backported) ^ ^ ^ | | | (code refactorings done | | | in master/trunk) / | / (*) (*) (*) -------------------------------------------------------> master/trunk | | | | | | / release-2.0.x / critical-feature (should be backported)

Preguntas:

  • ¿Cuál sería la mejor manera de realizar la función de backporting desde la perspectiva de VCS ?

  • ¿Debería hacerse esto como una merge simple de la rama de critical-feature correspondiente con conflictos de resolución de conflictos?

  • ¿O debería hacerse esto como la cherry-pick de la confirmación, que combina la critical-feature en el master/trunk cuando termina? ¿O tal vez incluso como un conjunto de cherry-picks de cherry-picks para cada compromiso en la rama de critical-feature ?

  • ¿Podría aconsejar algo para el procedimiento de resolución de conflictos? ¿Qué debería hacer uno si la diferencia actual entre release-2.0.x y master/trunk es tan grande, que el backporting "ingenuo" genera una gran cantidad de conflictos debido a la refactorización de código y características faltantes o API , que se agregaron después del release-2.0.x ?

  • ¿Tiene Git o Subversion algo específico que ofrecer para esta rutina, excepto la fusión estándar o el enfoque de selección? Supongo que el rebase no será útil en caso de que la cantidad de conflictos sea enorme, pero, obviamente, podría estar equivocado.


He desarrollado algunas herramientas específicamente para facilitar este proceso con git, y la semana pasada escribí una extensa publicación en el blog sobre ellas. En particular, el comando git cherry-menu referencia en esa publicación puede aceptar una lista arbitraria de commits para backport, así que usando git log y tu editor de texto favorito, podrías construir una lista de commits razonablemente cuidadosamente seleccionada que constituya la característica crítica para ser backported, y luego ejecutar algo como:

git checkout -b release-2.0.y release-2.0.x git cherry-menu cat commits-to-backport.txt

Esto es similar a la sugerencia de reposición de kan, excepto que el proceso de backporting es más estructurado, y mediante el uso de notas de git bajo el capó, se obtienen varias funciones extra útiles, incluyendo que todos los metadatos que describen el proceso se mantienen en varias ejecuciones de git cherry-menu .

Por supuesto, si solo tienes un puñado de commits para backport, kan tiene razón en que también podrías elegir directamente.

Lamentablemente, creo que la respuesta aceptada es ligeramente contradictoria:

Toda la idea de las características de backporting se ve rota para mí. Solo se deben respaldar los cambios críticos y no destructivos. Para las características y mejoras, debe crear una nueva bifurcación e iniciar el período de estabilización.

porque la creación de una nueva sucursal y el inicio de un período de estabilización siguen siendo backporting. ¡La única diferencia es a qué rama decides poner los commit invertidos! Puede ponerlos en la rama original release-2.0.x , o una rama diferente bifurcada, como la rama release-2.0.y que sugerí arriba. En general, es más seguro / más limpio hacer lo último (y supongo que ese es el punto de Ivan), pero realmente eso depende de cómo organices tus repositorios y sucursales. Sin embargo, todavía no evita la necesidad de realizar selecciones de cerezas y la posible resolución de conflictos.