Flujo de trabajo de Git para desarrolladores PHP: cómo dejar de temer los conflictos y amar la revisión de código
\n\n¿Alguna vez ha pasado medio día fusionando ramas solo para terminar con un "error fatal" en producción? ¿O tal vez su colega subió código "crudo" directamente a master y se enteró cuando el sitio se cayó? Si es así, bienvenido al club. Pero la buena noticia es que el 90% de estos problemas se resuelven con un flujo de trabajo de Git para desarrolladores PHP adecuado.
\n\nEn este artículo no vamos a repetir la documentación. Analizaremos escenarios reales: cómo organizar las ramas, cuándo usar rebase y cuándo merge, y cómo configurar procesos para que el equipo no se confunda con los commits. ¡Allá vamos!
\n\nPor qué "simplemente git add . && git push" es malo
\n\nMuchos desarrolladores PHP, especialmente al principio, usan Git como una "memoria USB en la nube". Hacen commits de todo, no escriben mensajes significativos y suben directamente a master. Esto funciona hasta el primer conflicto o hasta que necesitan revertir un cambio.
\n\nUn flujo de trabajo git php correcto debe resolver tres tareas:
\n- \n
- Aislamiento de cambios — para que una función o corrección de errores no rompa el código en funcionamiento. \n
- Transparencia — para que cualquier desarrollador entienda lo que está sucediendo en el proyecto. \n
- Automatización — para que las pruebas y los linters se ejecuten antes de que el código llegue a producción. \n
Veamos cómo implementar esto en la práctica.
\n\nEligiendo una estrategia de ramificación: Git Flow, GitHub Flow o algo propio?
\n\nPara proyectos PHP no hay una única respuesta correcta. Todo depende del tamaño del equipo y la frecuencia de los lanzamientos. Pero hay dos modelos populares.
\n\nGit Flow — clásico para proyectos grandes
\n\nSi está trabajando en una aplicación monolítica con versiones claras (por ejemplo, un lanzamiento al mes), Git Flow es su elección. Ramas principales:
\n- \n
master— solo código estable, correspondiente a producción. \n develop— rama de integración para todas las funciones. \n feature/*— cada nueva función. \n release/*— preparación para el lanzamiento. \n hotfix/*— correcciones urgentes. \n
Ejemplo para un desarrollador PHP: está escribiendo un módulo de pago. Crea la rama feature/payment-module desde develop. Al finalizar, hace un pull request a develop. Cuando se acumulan suficientes funciones, crea release/2.3.0, donde solo hay correcciones de errores. Luego fusiona en master y develop.
GitHub Flow — para iteraciones rápidas
\n\nSi tiene microservicios o despliega varias veces al día, GitHub Flow es más simple:
\n- \n
main(omaster) — siempre listo para desplegar. \n - Cualquier otra rama — para una función o corrección de errores. \n
- Después del pull request y la revisión, se fusiona inmediatamente en
main. \n
Para PHP, esto es especialmente conveniente cuando tiene CI/CD configurado: después de fusionar en main, las pruebas y el despliegue a staging o producción se ejecutan automáticamente.
\n\nEscribiendo commits significativos: ejemplos en PHP
\n\nUn commit no es solo "guardar". Es un documento con el que usted y sus colegas reconstruirán la historia. Use conventional commits:
\n\nfeat: add payment processing via Stripe\nfix: correct SQL query in user repository\nrefactor: extract validation logic to trait\n\n\nAhora imagine que está trabajando en un proyecto PHP con Laravel. Supongamos que agregó un nuevo comando de Artisan. ¿Qué commit sería útil?
\n\nfeat: add artisan command to sync expired subscriptions\n\n- Created SyncExpiredSubscriptions command\n- Added subscription:sync tag to schedule\n- Updated Subscription model with scopeExpired\n\n\nEn un mes, podrá encontrar rápidamente cuándo y por qué