He visto ramas de desarrolladores utilizadas en dos escenarios principales:
La comunidad de código abierto, donde estas ramas son en realidad bifurcaciones de repositorio, de modo que los encargados del proyecto pueden bloquear el acceso al repositorio maestro y requerir integración mediante solicitudes de extracción. Esto hace la vida más difícil para los contribuyentes, pero mucho más fácil para los mantenedores, lo que por supuesto es exactamente el punto, y este es un modelo muy exitoso en GitHub.
Equipos y organizaciones que no tienen una integración continua y un historial de inestabilidad en sus implementaciones, o peor aún, inestabilidad en sus compilaciones. Estos equipos generalmente intentan usar ramas de desarrollador como una forma de proteger la estabilidad de la línea principal, y el resultado es, típicamente, un período de fusión largo y muy doloroso antes del lanzamiento, seguido de un período de estabilización aún más largo y doloroso, que a veces no sucede hasta después del lanzamiento.
No quiero que esto sea una queja sobre por qué necesita CI, pero de su pregunta queda claro que sabe que no está integrando sus cambios con la frecuencia suficiente, por lo que la OMI no tiene sentido bailar sobre el tema.
A menos que esté trabajando en un equipo distribuido geográficamente con la necesidad de "bloquear" los cambios de los desarrolladores externos, el modelo de sucursal por desarrollador realmente no tiene mucho sentido. Especialmente no tiene sentido con git, porque cada desarrollador ya técnicamente tiene su propio repositorio. La mayoría de las organizaciones deberían integrarse con mucha frecuencia, como varias veces al día.
Actualmente formo parte de un grupo de aproximadamente 35 colaboradores divididos en 4 equipos separados, la mayoría de las personas se registran al menos 2-3 veces al día, algunas personas de 10 a 15 veces; Es inusual ver construcciones rotas y extremadamente raro que permanezcan rotas por más de unos minutos. Git maneja las fusiones tan fácilmente la mayor parte del tiempo que las ramas de desarrolladores remotos son una sobrecarga innecesaria. Simplemente tire, fusione localmente y ejecute pruebas de confirmación antes de presionar, es simple.
Si absolutamente debe diferir la integración para proteger la estabilidad de la rama maestra, el modelo típico y probado es usar una rama inestable , a veces llamada rama de desarrollo , como se describe en Un modelo de ramificación Git exitoso . Si los desarrolladores no pueden fusionarse con éxito en esta rama (que solo necesita construir , no ejecutar sin problemas) al menos una vez al día, entonces tiene un problema de calidad / disciplina y no un problema de control de revisión; encubrirlo usando ramas de desarrollador no integradas solo retrasa el problema y, al hacerlo, en realidad hace que las fusiones finales sean mucho más dolorosas e inestables de lo que realmente necesitan ser.
Las ramas de características no son las peores, pero muy pocos proyectos de la OMI son lo suficientemente grandes como para justificarlos; si su proyecto es muy grande (es decir, toneladas de características en las que se trabaja a la vez), verá mejores resultados al dividirlo en componentes autónomos separados que al empapelar el problema con el control de fuente.
Puede ignorar este consejo si lo desea, y muchos equipos lo hacen, pero una de las razones por las que el modelo de ramificación vinculado anteriormente es tan popular y exitoso es que está diseñado para trabajar con una integración continua, no en contra.
En tu rama de trabajo si vas:
También puede fusionarse desde la otra rama de desarrolladores
Lo que hará es fusionar los cambios en master a su rama de desarrollo.
fuente
git merge master
mientras estaba en la rama de características desprotegidas es lo que estaba buscando. GraciasSi dev-A y dev-B son ramas diferentes para un proyecto diferente, entonces lo que respondió @scaryrawr sería lo mejor.
Pero si dev-A y dev-B son precisamente el mismo código (mismo proyecto), entonces una alternativa sería que ambos funcionen en una de las ramas. Por ejemplo, crea una rama del maestro llamada 'devWork'. Ambos revisan devWork, trabajan en él, se comprometen y empujan los cambios. Los cambios impulsados no se realizarían en Master sino en devWork, luego los otros usuarios de la rama simplemente necesitan hacer un PULL localmente para recibir los cambios.
Luego, puede seguir los métodos estándar para realizar el trabajo en devWork de regreso a Master, etc.
fuente