¿Tirando de cambios de maestro a mi rama de trabajo?

16

Hay dos de nosotros trabajando en algo. Estamos usando esta estructura de rama

  • Maestro
  • dev-A
  • dev-B

Ambos trabajamos en ramas separadas (dev-A, B) y cada vez que terminamos, promovemos nuestros cambios para dominar.

Pero el inconveniente de esto es que no podemos obtener los cambios que hace el otro desarrollador. Todo existe en el árbol maestro, pero no podemos obtener las últimas actualizaciones que realizó el otro desarrollador.

¿Hay alguna manera de resolver esto o deberíamos cambiar nuestra estructura de sucursal (por función)?

Utkarsh Sinha
fuente

Respuestas:

16

He visto ramas de desarrolladores utilizadas en dos escenarios principales:

  1. 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.

  2. 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.

Aaronaught
fuente
Creo que la importancia de la integración continua no se puede enfatizar lo suficiente, tanto en el sentido de integrar todo en una rama, como en el sentido de compilaciones diarias / por hora (usando Jenkins o similar).
sleske
15

En tu rama de trabajo si vas:

git commit -am "Committing changes before merge"
git merge master

También puede fusionarse desde la otra rama de desarrolladores

git checkout dev-A
git merge dev-B

Lo que hará es fusionar los cambios en master a su rama de desarrollo.

scaryrawr
fuente
Sí, esa es una forma. Esperaba que Git tuviera un flujo de trabajo elegante para esto.
Utkarsh Sinha
2
Bueno, git generalmente funciona mejor si cada desarrollador tiene su propio repositorio de trabajo local y un repositorio central compartido que los desarrolladores empujan y sacan. De esa manera, cada uno puede trabajar en las mismas ramas y obtener actualizaciones tirando y colocando cambios empujando al repositorio central. Esa es probablemente la elegancia que estás buscando. git se encargará de la fusión automáticamente a menos que haya un conflicto. git flow es una buena adición para el flujo de trabajo.
scaryrawr
Perfecto Hay algunas respuestas muy largas para esta pregunta exacta en algunos lugares, pero git merge mastermientras estaba en la rama de características desprotegidas es lo que estaba buscando. Gracias
Drenai
3

Si 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.

David 'el jengibre calvo'
fuente