He visto muchos consejos sobre los modelos de ramificación git y la opinión más común parece ser que hacer cambios directamente en la rama maestra es una mala idea.
Uno de nuestros compañeros de trabajo está muy contento de hacer cambios directamente en la rama maestra y, a pesar de varias conversaciones, es probable que no cambien esto.
En este momento, no puedo convencer a un compañero de trabajo de que es una mala práctica trabajar directamente en master, pero me gustaría entender las cosas que entrarán en conflicto con su forma de trabajar, para saber cuándo necesito volver a visitarlo. este problema.
version-control
git
svn
branching
linuxunil
fuente
fuente
Respuestas:
Existen varios problemas cuando las confirmaciones se envían directamente al maestro
fuente
Explíquele que las nuevas características necesitan su propia rama de desarrollo que se pueda implementar en un entorno de prueba antes de que se lance a producción.
De lo contrario, se encuentra en un estado perpetuo de características a medio completar. No puede implementar características a medio completar en producción, por lo que si está trabajando directamente en la rama maestra, todos los demás deben esperar a que termine su característica antes de que los cambios de otra persona puedan pasar a producción, incluidas las correcciones de errores.
El uso de ramas independientes para las características significa que cada nueva característica se puede probar e implementar independientemente de las demás.
fuente
Master debería ser potencialmente liberable. Período. No debe haber ningún trabajo a medio terminar en el maestro (a menos que esté deshabilitado con un indicador de función)
Dicho esto, he visto a algunos equipos complicar su flujo.
No utilizar PR cuando se integra para dominar es un error, ya que los desarrolladores no tendrán el poder de elegir cuando ocurra la integración.
Una sola rama de desarrollo aporta muy poco valor. Por lo general, solo complica las cosas. Muchas ramas de características aportan mucho valor.
Hacer ramas para cada entorno (dev, test, prod) es un error. Esto está fuera del alcance de git y debe ser manejado por la tubería de lanzamiento. Se debe implementar exactamente la misma compilación en todos los entornos, lo cual es imposible si hay ramas para cada entorno.
Si una característica es tan grande que no se puede hacer en un día o dos, todo el trabajo en una rama de la característica debe estar en ramas separadas e integradas con PR.
fuente
fuente
Primero, quiero señalar que en git, cada una
pull
es literalmente una operación de ramificación, y cadapush
una es una fusión. losmaster
máquina de un desarrollador es una rama completamente separada de lamaster
de un repositorio central que comparte, con la misma posición desde una perspectiva técnica. Ocasionalmente cambiaré el nombre de mi versión localupstream
o algo así si se adapta mejor a mis propósitos.Lo señalo porque muchas organizaciones piensan que están utilizando sucursales de manera más efectiva que su colega, cuando realmente están haciendo poco más que crear un nombre adicional para una sucursal en el camino, que de todos modos no se guardará en el historial. Si su colega está confirmando características en una confirmación atómica, es tan fácil retroceder como una confirmación de fusión de una rama de características. La gran mayoría de las ramas de características deberían ser de corta duración y, de todos modos, fusionarse con frecuencia.
Dicho esto, los principales inconvenientes de su estilo de trabajo son dobles. Primero, hace que sea muy difícil colaborar en una característica inacabada. Sin embargo, no sería difícil crear una sucursal solo en aquellos momentos en que se necesita colaboración.
En segundo lugar, hace que la revisión antes de la fusión sea muy difícil. En este punto, en realidad no necesitas convencerlo. Puede adoptar una herramienta como github, gerrit o gitlab, y requerir revisiones de código de solicitud de extracción y pruebas automáticas aprobadas para todas las fusiones. Si no está haciendo algo como esto, francamente no está utilizando git en todo su potencial, y no es de extrañar que su colega no vea ese potencial.
fuente
pull
crearía una nueva sucursal o cómo apush
sería una operación de fusión. Más bien, apull
es literalmente unfetch
seguido de amerge
!master
es una rama diferente deorigin master
. Técnicamente, son ramas diferentes en dos controles remotos diferentes, cada uno con su propia historia.pull
: Antes: dos ramas potencialmente apuntando a confirmaciones diferentes - Después: dos ramas apuntando a confirmaciones equivalentes - No se crearon ramas, por lo tanto no lo llamaría una "operación de ramificación". Si alguno de los dos comandos, lo llamaríapush
, porque potencialmente crea una nueva rama en el control remoto. Lo que no hace, es una fusión.Otras respuestas ya han mencionado varias ventajas (características aisladas, código siempre enviable en el maestro, etc.) para trabajar NO directamente en el maestro.
Para mí parece que tienes un problema diferente. Obviamente, no tiene un proceso de desarrollo, que todos los desarrolladores acuerdan o utilizan (o su desarrollador en cuestión ignora totalmente el proceso).
¿Tiene ramas de características, que se fusionan en master o tiene diferentes ramas de versiones también o utiliza un proceso totalmente diferente?
"No utilizar la rama maestra" no es suficiente.
fuente
Esto me lleva a creer que hay más problemas. Trabajar en master o no es principalmente parte de una filosofía más amplia sobre cómo, qué y cuándo lanzar productos.
Entonces, junto con un "nunca debe trabajar en master", ¿tiene pruebas de características, prueba el trabajo de los demás y revisa el código de los demás? Pruebas de aceptación e integración.
Si no tiene ninguno de los anteriores y solo lo está haciendo para "hacer git", también podría trabajar en master.
fuente
No hay "mala práctica" en torno al trabajo directo en la sucursal. Pero debe decidir qué es lo que mejor respalda su proceso:
Pregunta 1: ¿Debería su maestro representar el estado actual de lanzamiento de su software? Luego, debe introducir una rama de desarrollo global y fusionar el desarrollo al final de un desarrollo de lanzamiento.
Pregunta 2: ¿Quieres tener un proceso de revisión de código? Entonces debe tener "ramas de características" que se fusionarán en master (o desarrollar, si tiene una) a través de solicitudes de extracción.
Pregunta 3: ¿Es necesario compartir el estado del código intermedio con otros desarrolladores que aún no deberían publicarse en producción (o prueba)? Es el caso de que más de un desarrollador desarrolle una función. Entonces deberías introducir "ramas de características".
fuente