En nuestro equipo, utilizamos Git como nuestro control de origen. Tenemos varias áreas de código que son casi independientes pero que tienen cierta superposición. Últimamente hemos estado discutiendo flujos de trabajo y enfoques para usar el control de código fuente. Una queja que surge cuando promuevo el uso de un flujo de trabajo de rama de características es que las personas a menudo se encuentran con conflictos de fusión complicados que resuelven incorrectamente. Por complicado, quiero decir "no es obvio en cuanto a cómo resolver". A la luz de esto, se están utilizando más activamente otros flujos de trabajo, como un flujo de trabajo basado en "rebase de extracción".
Como defensor del enfoque de la rama de características, realmente no estoy recibiendo la queja. Sí, debe mantener sus ramas de características locales actualizadas desde el maestro o donde sea, pero ese es el único problema real que veo. Estoy pensando que si sus fusiones son siempre complicadas y pueden tener efectos secundarios, entonces eso es más un problema de trabajo en equipo que un problema de Git.
¿Estoy en lo correcto al pensar esto? ¿Los conflictos de fusión complicados son un signo de algo bueno o malo?
fuente
Respuestas:
No es imposible que el problema sea tu código. Si su base de código tiene muchas interrelaciones entre módulos, entonces cada cambio tendrá zarcillos en todas partes, y cada desarrollador interactúa con el código de cualquier otra persona, será una pesadilla.
Tendería a pensar que notarías esto de otras maneras primero, pero es posible que estés tan acostumbrado que ya no puedas verlo.
fuente
Estoy acostumbrado al flujo de trabajo "fetch-rebase-push". ¿Cuál es en realidad el primer flujo de trabajo más primitivo que se describe en su tutorial? Aquí están las ventajas:
Ahora, sobre conflictos de fusión complicados. No entiendo cómo se pueden experimentar fusiones frecuentes y complicadas. La complicación surge de no hacer rebase / selección de cerezas durante mucho tiempo, trabajando en esa característica solitaria durante un mes.
Personalmente, preferiría lidiar con conflictos de fusión fáciles y frecuentes (en realidad, rebase), en lugar de un horror de fusión raro y abarcador.
fuente
Las fusiones y rebases deben causar exactamente los mismos conflictos, para aquellos conflictos inherentes que un humano debe resolver (es decir, dos desarrolladores que cambian la misma línea de código). Para otros conflictos, las fusiones en realidad tienden a ser más limpias, porque no está cambiando el SHA-1 de los commits en todo el lugar. No estoy seguro de cómo se las arregla para entrar en un estado donde las fusiones causan más conflictos que rebases, pero ciertamente es una señal de que el flujo de trabajo de algunas personas está en mal estado, y probablemente necesiten más capacitación sobre cómo funciona git. ¿Están eliminando los compromisos de fusión de otras personas cuando hacen sus rebases locales, o algo así?
El beneficio y el inconveniente del método pull-rebase es muy similar a los flujos de trabajo centralizados a los que mucha gente está acostumbrada. No tiene que entender la ramificación para usarla.
En cualquier caso, es perfectamente factible hacer un flujo de trabajo de sucursal de características solo localmente, si no puede hacer que otras personas inicien sesión en él.
fuente
El proyecto en el que estoy trabajando tiene este tipo de problemas de vez en cuando y parece ser el resultado de un par de factores:
Estoy interesado en el potencial de Semantic Merge para ayudarme con algunos de esos problemas, pero obviamente eso solo sirve de algo si estás trabajando en un idioma que pueda analizar y aún no me he encontrado con desafíos importantes cuando ' Lo estoy usando, así que no puedo garantizar su efectividad.
fuente
A menos que los desarrolladores estén modificando confirmaciones históricas (en lugar de combinaciones puras), los conflictos en un modelo git de flujo de trabajo de características son un signo de una base de código estrechamente acoplada (/ nueva base de código) o una asignación de características superpuestas.
fuente
Tiene una rama principal (maestra) y todos trabajan en sus ramas características.
El trabajo en las ramas de funciones puede llevar desde unas pocas horas hasta unos pocos meses.
De vez en cuando, alguien volverá a fusionar su conjunto de cambios en la rama principal. El líder de su equipo debe asegurarse de que solo una persona realice una fusión inversa a la vez. Una vez hecho esto, debe reenviar la fusión de la rama principal a su rama de características. Una vez que todos hacen una combinación directa, se puede permitir que otra persona invierta la combinación en la rama principal. De lo contrario, demasiados cambios se fusionarán inversamente y tendrá toneladas de conflictos de fusión en su combinación hacia adelante.
Solo para aclarar la terminología, por "fusión inversa" me refiero a la fusión de la rama característica en la rama principal, y por "fusión directa" me refiero a la fusión de la rama principal en la rama característica. Según lo que he experimentado antes, es probable que vea más conflictos de fusión en combinación inversa, en lugar de combinación directa.
fuente
Dos cosas que pueden ayudar: una, evite las herramientas que realizan cambios por su cuenta. Dos desarrolladores que usan diferentes configuraciones de pestañas son una receta para el desastre. Dos, hacer cambios en diferentes ubicaciones. Obtendrá un problema, por ejemplo, si tres desarrolladores agregan código al final del mismo archivo, mucho mejor si agregan código en diferentes lugares.
fuente