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óximarelease-2.1.x
).Ahora, en algún momento, se desarrolló y se fusionó otra característica (a saber,
critical-feature
) con elmaster/trunk
. Nos damos cuenta de que esta característica es tan importante, que debemos respaldarla conrelease-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 decritical-feature
correspondiente con conflictos de resolución de conflictos?¿O debería hacerse esto como la
cherry-pick
de la confirmación, que combina lacritical-feature
en elmaster/trunk
cuando termina? ¿O tal vez incluso como un conjunto decherry-picks
decherry-picks
para cada compromiso en la rama decritical-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
ymaster/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 oAPI
, que se agregaron después delrelease-2.0.x
?¿Tiene
Git
oSubversion
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.
Toda la idea de las características de backporting se ve rota para mí. Solo los cambios críticos y no destructivos deben ser respaldados. Para las características y mejoras, debe crear una nueva bifurcación e iniciar el período de estabilización.
Consulte el proceso de publicación utilizado en el propio proyecto Apache Subversion: https://subversion.apache.org/docs/community-guide/releasing.html#release-stabilization