Cambiar tema

Git avanzado: colaboración en equipo y mejores prácticas de gestión de ramas

Easton editorial illustration: bottleneck pressure gauge

Introducción

Un compañero me mencionó en el grupo: «El merge que acabas de hacer sobrescribió mi función de inicio de sesión; los usuarios en producción ya no pueden entrar…»

Abrí el código y vi marcadores de conflicto por todas partes, sin distinguir qué era mío y qué era suyo. Esa noche aprendí la lección: saber comandos básicos de Git no es lo mismo que colaborar en equipo.

Si alguna vez has tenido demasiadas ramas para recordar, miedo a fusionar por los conflictos o un historial de commits enredado como un ovillo, este artículo te ayudará. Comparto lecciones prácticas de años de trabajo en equipo: desde elegir el flujo de trabajo hasta resolver conflictos, ordenar el historial y establecer la revisión de código. Al terminar, sabrás elegir la estrategia de ramas adecuada, resolver conflictos con elegancia, usar rebase para limpiar el historial y montar un proceso de revisión eficiente.

Capítulo 1: Elige el flujo de trabajo Git adecuado para tu equipo

Sinceramente, cuando empecé a liderar un equipo no sabía qué flujo de trabajo Git usar. Escuché que Git Flow era muy profesional y lo copié tal cual. Resultado: un equipo de 5 personas gastaba media hora al día solo gestionando ramas, y al final todos se hartaron.

Luego entendí que no hay un flujo de trabajo perfecto, solo el más adecuado.

Git Flow vs GitHub Flow vs Trunk Based Development

Te explico las diferencias de la forma más simple:

Git Flow es como una cadena de montaje estricta, con ramas dedicadas de desarrollo (develop), funcionalidad (feature), publicación (release) y corrección urgente (hotfix). Empresas como Microsoft e IBM lo usan mucho porque tienen ciclos de release claros, por ejemplo una versión al mes.

Para equipos pequeños, Git Flow es demasiado pesado. Mi equipo anterior era así: cada release implicaba sacar una rama release desde develop, fusionarla a master tras las pruebas y volver a fusionar a develop. Solo ese proceso ya era agotador.

GitHub Flow es mucho más simple: una sola rama principal (main/master), todas las funcionalidades salen de ahí en ramas feature y, al terminar, se fusionan vía PR. Encaja muy bien en equipos de 3-10 personas como el nuestro, con iteración rápida y entrega continua.

Mi equipo actual usa GitHub Flow con CI/CD automatizado; básicamos podemos publicar varias veces al día. El equipo lo encuentra ligero: no hay que memorizar tantas reglas de ramas.

Trunk Based Development (TBD) es aún más extremo: todos desarrollan directamente en la rama principal y las ramas suelen vivir menos de un día. Solo empresas como Google o Facebook, con testing automatizado muy sólido, se atreven.

Para equipos normales como el nuestro, TBD es demasiado agresivo. Salvo que tu cobertura de tests supere el 90 %, es fácil romper la rama principal.

Tendencias en 2025

He leído bastante material reciente y la tendencia en 2025 es el modelo híbrido. Equipos pequeños (1-10 personas) usan básicamente GitHub Flow con GitHub Actions o GitLab CI. Equipos medianos y grandes combinan partes de Git Flow con GitHub Flow según su contexto.

Por ejemplo, la empresa de un amigo tiene 20 personas y usa «GitHub Flow + rama release»: el desarrollo diario sigue GitHub Flow, pero antes de cada versión sacan una rama release para estabilizar.

Mi recomendación:

  • Equipos de 1-5: GitHub Flow directamente, sin complicarte
  • Equipos de 5-15: GitHub Flow + proceso de release simplificado
  • 15+ personas: Git Flow o híbrido, pero con CI/CD completo

Ah, y un punto clave: no sobre-diseñes. He visto equipos que arrancan con estrategias de ramas hipercomplejas, nadie las sigue y al final cada uno hace lo suyo.

Capítulo 2: Reglas de oro de la gestión de ramas

Lo que más duele en la colaboración es el caos de ramas. En un proyecto anterior el repositorio tenía más de 70 ramas remotas; al menos la mitad eran «zombies» de hace dos años. Encontrar la tuya costaba una eternidad.

Resumí unas «reglas de oro» de gestión de ramas; al aplicarlas, el repositorio quedó mucho más limpio.

Convención de nombres de ramas

Primero, nomenclatura. Exigimos prefijos en todos los nombres:

  • feature/ — desarrollo de nuevas funcionalidades
  • bugfix/ — corrección de bugs
  • hotfix/ — corrección urgente
  • release/ — rama de publicación

Y el número de tarea es obligatorio, por ejemplo: feature/JIRA-1234-user-login

Así ves de un vistazo para qué sirve la rama y quién la lleva. Antes teníamos una rama llamada test; tres meses después nadie recordaba qué probaba y hubo que borrarla.

Otros consejos:

  • No uses nombres de rama en chino; Git lo soporta, pero en algunos sistemas se ven mal
  • Evita caracteres especiales, sobre todo espacios y @
  • Une palabras con guiones -, no con guiones bajos _ (convención habitual)

Ciclo de vida de las ramas

Lo más absurdo que vi: una rama feature abierta tres meses sin fusionar. Al intentar el merge, los conflictos eran ingobernables y hubo que reescribir.

Ahora exijo: la vida de una rama feature no supera los 3 días. Si la funcionalidad es grande, divídela en varias features pequeñas y fusiónalas por partes.

Eliminar la rama justo después del merge es ley. Muchos no quieren: «¿y si la necesito luego?». Créeme, no. Git guarda todo el historial; siempre puedes recuperar el código fusionado.

Los comandos para borrar los tengo en mis notas del móvil:

# Eliminar rama local
git branch -d feature/xxx
# Eliminar rama remota
git push origin --delete feature/xxx

Si ya hay muchas ramas zombie:

# Ver ramas ya fusionadas en main
git branch --merged main
# Eliminar en lote (con cuidado)
git branch --merged main | grep -v "main" | xargs git branch -d

Protección de ramas

Otro punto vital: proteger la rama principal.

Al empezar a liderar, todos podían hacer push directo a main. Un becario subió código a medias y el entorno de pruebas se cayó.

Configuramos reglas en GitHub/GitLab:

  • main sin push directo; solo PR/MR
  • Al menos 1 aprobación para fusionar
  • CI obligatoria (tests unitarios, lint)

Se configura en Settings → Branches → Branch protection rules.

Parece burocracia, pero evita errores tontos. Además, la revisión de código es una buena oportunidad de aprendizaje entre el equipo.

Capítulo 3: Git Rebase vs Merge — ¿cuándo usar cada uno?

La primera vez que usé rebase no entendí nada. Tras git rebase, vi que todos los commit ID habían cambiado y pensé que había perdido el código.

Luego entendí: rebase y merge fusionan código, pero la lógica interna es distinta.

Diferencia esencial entre Merge y Rebase

Una analogía sencilla:

Merge es como dos ríos que confluyen: ves dónde se unen y el cauce se ensancha. En Git, merge crea un merge commit y el historial muestra bifurcaciones claras.

Rebase es como verter un afluente en el curso principal: parece que siempre hubo un solo río. Rebase reescribe el historial, «mueve» tus commits detrás de la rama destino y los IDs cambian.

Técnicamente:

  • Merge conserva el historial completo, incluida creación y fusión de ramas
  • Rebase deja un historial lineal y limpio, pero pierde contexto de ramas

Casos de uso y regla de oro

¿Cuándo usar cada uno? Mi experiencia:

Usa Merge cuando:

  • Fusionas la feature en main de forma definitiva
  • Fusionas ramas compartidas del equipo
  • Quieres conservar el historial de fusiones

Usa Rebase cuando:

  • Tu feature va retrasada respecto a main y quieres actualizar
  • Ordenas tu rama personal (antes del push)
  • Quieres historial lineal

Pero hay una regla de oro:

¡Nunca hagas rebase de commits ya pusheados en una rama compartida!

¿Por qué? Rebase cambia los commit ID. Si alguien basó su trabajo en tus commits antiguos, tras tu rebase su rama se desordena. Un compañero lo hizo y todo el equipo tuvo que volver a clonar; nos echó la bronca una semana.

Mi principio: rebase libre en local, piensa antes de hacer push.

Rebase interactivo en la práctica

No se puede hablar de rebase sin git rebase -i (rebase interactivo). Es muy potente.

Desarrollé una funcionalidad con una docena de commits titulados «fix», «modif», «otra vez»… poco profesional. Antes de fusionar en main, con git rebase -i los compacté en 3 commits claros.

# Ordenar los últimos 10 commits
git rebase -i HEAD~10

Se abre un editor con algo así:

pick a1b2c3d 添加用户登录功能
pick e4f5g6h 修复登录bug
pick i7j8k9l 再改
pick m0n1o2p 优化登录逻辑
...

Puedes cambiar la acción:

  • pick — conservar el commit
  • squash o s — fusionar con el anterior
  • reword o r — cambiar el mensaje
  • edit o e — pausar para editar contenido
  • drop o d — eliminar el commit

Por ejemplo:

pick a1b2c3d 添加用户登录功能
squash e4f5g6h 修复登录bug
squash i7j8k9l 再改
reword m0n1o2p 优化登录逻辑

Los tres primeros se fusionan; el cuarto te pide un mensaje nuevo.

La primera vez parece complejo, pero con práctica fluye. El historial queda mucho más limpio: adiós a commits «modif», «otra vez», «y otra».

Mejores prácticas 2025: rebase en local para ordenar, merge al integrar en main. Historial claro en main y se conserva la información de fusiones importantes.

Capítulo 4: Los conflictos ya no dan miedo

Los conflictos de Git me dejaron secuelas. La primera vez vi <​<<<<<< y >​>>>>>> por todas partes, no sabía qué hacer y borré mi código para reescribirlo.

Luego vi que no son tan terribles si entiendes los marcadores y previenes.

Mejores prácticas para prevenir conflictos

Muchos conflictos se evitan. Exijo al equipo:

1. Sincronizar main al menos una vez al día

Al empezar:

git checkout main
git pull origin main
git checkout feature/xxx
git merge main  # o git rebase main

Así tu feature no se queda muy atrás y habrá menos conflictos al fusionar.

2. Commits pequeños y merges rápidos

Ya dije: la rama feature no supera los 3 días. Cuanto más viva, mayor la diferencia con main y más probabilidad de conflicto.

3. Comunicar antes de colaborar

Si dos personas tocan el mismo archivo, avisen. Mantenemos en Notion una tabla de «funcionalidades en desarrollo»: quién modifica qué queda claro.

Entender los marcadores y resolver a mano

Aun con prevención, habrá conflictos. Verás algo así:

<<<<<<< HEAD
function login(username, password) {
  // tu código
  return api.post('/login', { username, password });
}
=======
function login(email, password) {
  // código del compañero
  return api.post('/auth/login', { email, password });
}
>>>>>>> feature/new-login

Es sencillo:

  • Entre <<<<<<< HEAD y =======: tu rama
  • Entre ======= y >>>>>>> feature/new-login: la rama entrante

Decide qué conservar o cómo combinar. En el ejemplo, hablad: ¿username o email? ¿qué ruta de API?

Tras resolver, elimina los marcadores:

git add .
git commit -m "Resolver conflicto de merge en inicio de sesión"

Herramientas visuales

Resolver a mano cansa con muchos conflictos. Uso la herramienta integrada de VS Code.

El archivo en conflicto se resalta y aparecen botones:

  • «Accept Current Change» — conservar tu código
  • «Accept Incoming Change» — conservar el del otro
  • «Accept Both Changes» — conservar ambos
  • «Compare Changes» — vista de comparación

Un clic y listo, mucho más rápido que editar a mano.

Si es muy complejo, git mergetool con p4merge ofrece tres columnas (base, tu versión, la otra) y se ve mejor.

Validar tras resolver el conflicto

Una vez resolví, hice commit y push sin más, y borré sin querer lógica clave de un compañero; la funcionalidad falló en producción. Desde entonces: validar siempre tras resolver.

Ahora siempre:

  1. Ejecuto tests en local
  2. Reviso con git diff que no haya borrados accidentales
  3. Si puedo, pido revisión al compañero

Son minutos que evitan incidentes.

Capítulo 5: Establecer un proceso eficiente de revisión de código

Al principio detestaba la revisión de código. «Mi código ya está bien, ¿por qué que me corrijan?» Y las idas y venidas parecían pérdida de tiempo.

Cuando empecé a revisar a otros, entendí que el valor va mucho más allá de «encontrar bugs».

El verdadero valor de la revisión de código

Al menos tres valores:

1. Compartir conocimiento — El equipo sabe qué hace cada uno; evita silos. Varias veces aprendí en PRs de otros cómo implementar algo.

2. Calidad — Otro par de ojos detecta lo que tú pasas por alto. Escribí una recursión que en mis tests iba bien; el revisor vio que faltaba un caso límite y casi provocamos desbordamiento de pila.

3. Crecimiento técnico — Leer buen código es la mejor forma de aprender. Muchas técnicas las saqué de PRs de seniors.

Mejores prácticas de PR

Para que la revisión sea eficiente, el PR debe estar bien hecho. Tenemos acuerdos:

Tamaño adecuado del PR

Lo ideal: 200-400 líneas, máximo ~500. Nadie revisa en serio un PR gigante; se convierte en trámite.

Si la funcionalidad es grande, divide en varios PR. Por ejemplo, un sistema de usuarios:

  • PR1: diseño de tablas y modelos base
  • PR2: API de registro
  • PR3: API de login
  • PR4: API de modificación de perfil

Descripción clara del PR

Plantilla de descripción:

## Contexto
Por qué haces este cambio

## Cambios
- Nueva funcionalidad xxx
- Corrección de bug xxx
- Refactor del módulo xxx

## Pruebas
- [ ] Tests unitarios OK
- [ ] Pruebas funcionales en local OK
- [ ] Validado en entorno de pruebas

## Notas
Cambios de configuración, migraciones de BD, etc.

El revisor entiende de un vistazo qué y por qué.

Mensajes de commit estandarizados

Seguimos Conventional Commits con prefijo de tipo:

  • feat: añadir inicio de sesión de usuario
  • fix: corregir validación de contraseña
  • refactor: refactorizar capa de servicio de usuario
  • docs: actualizar documentación de API

Así puedes generar changelog y localizar cambios en el historial.

Responsabilidades de revisor y autor

La revisión es bidireccional.

El revisor debe:

  • Responder en 24 h (no dejar PRs colgados días)
  • Comentarios constructivos («sugiero cambiar a xxx porque…» mejor que «esto está mal»)
  • Centrarse en lógica, legibilidad y bugs potenciales; el estilo lo deja el lint

El autor debe:

  • Responder a los comentarios
  • Explicar el diseño; si no se entiende, quizá el código no es claro
  • Escuchar sugerencias aunque al principio parezcan raras

Al empezar como revisor escribía «esto está mal, cámbialo» y el autor no sabía qué quería. Ahora escribo: «Este bucle puede ser lento con muchos datos; prueba xxx o yyy, ¿qué te parece?» — comunicación mucho mejor.

Tendencia 2025: revisión de código asistida por IA

En 2025 salieron muchas herramientas de revisión asistida por IA. GitHub lanzó en octubre Code Quality, que detecta mantenibilidad y seguridad.

Lo probé y encuentra cosas que pasamos por alto:

  • Excepciones no manejadas
  • Posibles fugas de memoria
  • Funciones demasiado complejas (alta complejidad ciclomática)

Pero la IA no sustituye la revisión humana en diseño y lógica de negocio.

Mi flujo: la IA escanea problemas obvios; luego reviso diseño y lógica en profundidad. La eficiencia subió bastante.

Capítulo 6: Errores comunes y guía de evitación

Por último, algunos hoyos que pisamos nosotros para que tú los evites.

El peligro del push forzado

Mi rama feature iba muy retrasada respecto a main. Tras rebase no podía hacer push: historial local y remoto distintos.

Busqué y encontré git push -f. «Push forzado» sonaba potente y lo usé.

Sobrescribí todo lo que un compañero acababa de subir. Tuvimos backup; si no, perdía un día de trabajo.

git push -f (o git push --force) es de los comandos más peligrosos: tu historial local pisa el remoto sin mirar commits nuevos allí.

Cuándo sí (con cuidado):

  • Tu rama feature personal y seguro de que nadie más la usa

Cuándo nunca:

  • main/master y ramas compartidas
  • Cualquier rama que use otra persona

Si de verdad necesitas forzar, git push --force-with-lease es más seguro: rechaza si hay commits nuevos en remoto.

Otros errores frecuentes

1. Desarrollar directamente en main

Nunca. Aunque sea un carácter: abre rama y fusiona vía PR. Queda trazabilidad y rollback fácil.

2. Mensajes de commit descuidados

«fix», «modif», «111», «asdf»… inútiles al revisar el historial seis meses después.

Escribe cada commit con claridad: qué cambiaste y por qué.

3. No eliminar ramas ya fusionadas

Bórralas al fusionar. GitHub y GitLab pueden eliminarlas automáticamente al cerrar el PR; actívalo.

4. Usar git add . a ciegas

Mete todo en staging, incluso lo que no quieres. Vi a alguien subir .env con contraseñas.

Mejor git add -p: pregunta cambio a cambio; más lento, más seguro.

Checklist de normas Git para el equipo

Gestión de ramas

  • Nomenclatura unificada (feature/, bugfix/, etc.)
  • Nombre con número de tarea
  • Rama feature ≤ 3 días
  • Eliminar tras el merge
  • Protección de main

Commits de código

  • Mensajes con prefijo de tipo (Conventional Commits)
  • Un commit, un cambio lógico
  • Lint y tests antes de subir
  • Sin información sensible (.env, claves, etc.)

Revisión de código

  • PR de tamaño razonable (200-400 líneas)
  • Descripción clara (contexto, cambios, pruebas)
  • Al menos 1 aprobación para fusionar
  • CI en verde para fusionar
  • Respuesta en 24 h

Gestión de conflictos

  • Sincronizar main cada día
  • Tests tras resolver conflictos
  • Hablar con el equipo si hay dudas

Operaciones prohibidas

  • No desarrollar directamente en main
  • No usar git push -f en ramas compartidas
  • No hacer rebase de commits ya pusheados en compartido
  • No subir código sin probar

Conclusión

Recuerdo esa noche a las 2 h gestionando un incidente en producción; ojalá hubiera sabido todo esto. Las caídas se convierten en experiencia.

Git en sí no es difícil; lo difícil es el consenso en el equipo. El mejor flujo de trabajo sirve de poco si nadie lo cumple.

Mi consejo: empieza simple y optimiza poco a poco. No arranques con normas monstruosas; ajusta según la realidad del equipo.

Por ejemplo:

  • Semana 1: unificar nomenclatura de ramas
  • Semana 2: protección de main
  • Semana 3: proceso de revisión de PR
  • Semana 4: Conventional Commits

Ve despacio; da tiempo de adaptación.

Lo más importante: comunicar. Si hay problemas, no te encierres; habla con el equipo. Muchos conflictos Git son de comunicación, no de tecnología.

Para seguir mejorando en Git:

En el próximo artículo quizá cubra técnicas avanzadas: cherry-pick, stash, submodule… Si te interesa, síguenos.

¡Que tu colaboración Git con el equipo vaya cada vez más fluida y no tengas que levantarte a las 2 h por un merge mal resuelto!

Flujo completo de colaboración Git en equipo

Del flujo de trabajo a la revisión de código: gestión de ramas, resolución de conflictos y mejores prácticas

Estimated time: PT1H

  1. 1

    Step 1: Elegir el flujo de trabajo Git adecuado

    Según el tamaño del equipo:
  2. 2

    Step 2: Establecer normas de gestión de ramas

    Nomenclatura: prefijos unificados (feature/, bugfix/, hotfix/, release/), número de tarea obligatorio (feature/JIRA-1234-user-login), guiones - no guiones bajos _, sin chino ni caracteres especiales. Ciclo de vida: feature ≤ 3 días, eliminar tras merge (git branch -d feature/xxx, git push origin —delete feature/xxx), limpieza masiva con git branch —merged main | grep -v “main” | xargs git branch -d. Protección: main sin push directo, PR obligatorio, ≥ 1 approve, CI en verde en GitHub/GitLab.
  3. 3

    Step 3: Dominar Rebase y Merge

    Merge: fusión feature → main, ramas compartidas, conservar historial de fusión. Rebase: ponerse al día con main, ordenar rama personal antes del push, historial lineal. Regla de oro: nunca rebase de commits ya pusheados en compartido. Rebase interactivo: git rebase -i HEAD~10 con pick/squash/reword/edit/drop. Práctica 2025: rebase en local, merge en main.
  4. 4

    Step 4: Prevenir y resolver conflictos de Git

    Prevención: sync diaria de main (git checkout main && git pull origin main && git checkout feature/xxx && git merge main), features ≤ 3 días, comunicación sobre archivos compartidos. Marcadores: entre <<<<<<< HEAD y ======= tu código; entre ======= y >>>>>>> el entrante. Herramientas: VS Code (Accept Current/Incoming/Both, Compare), git mergetool + p4merge. Tras resolver: tests, git diff, revisión de un compañero.
  5. 5

    Step 5: Establecer revisión de código eficiente

    PR 200-400 líneas (máx. ~500), dividir si hace falta. Descripción: contexto, cambios, pruebas, notas. Conventional Commits (feat/fix/refactor/docs). Revisor: < 24 h, comentarios constructivos, lógica y bugs. Autor: respuestas y explicación del diseño. 2025: IA (ej. GitHub Code Quality) para lo técnico, humano para diseño y negocio.
  6. 6

    Step 6: Evitar errores y formalizar el equipo

    Prohibido: dev en main, push -f en compartido (preferir —force-with-lease), rebase de commits pusheados en compartido, código sin probar. Errores: commits vagos, ramas sin eliminar, git add . (preferir git add -p). Checklist: ramas, commits, revisión, conflictos — reglas anteriores.

FAQ

¿Qué flujo de trabajo Git debería elegir un equipo pequeño?
Recomendamos GitHub Flow:

• Simple y rápido: una sola rama principal, cada funcionalidad sale en una rama feature
• Iteraciones frecuentes: con CI/CD, varios despliegues al día son posibles
• Curva de aprendizaje baja: el equipo entiende y respeta las reglas con facilidad

Por qué no Git Flow en equipos pequeños:
• Proceso pesado: hay que mantener develop, feature, release y hotfix
• Más adecuado para grandes organizaciones con ciclos de release fijos
• Demasiado lento en el día a día para un equipo pequeño

Tendencia 2025: modelo híbrido — GitHub Flow para equipos pequeños, elementos de Git Flow para equipos medianos. Lo esencial: no sobre-diseñar; adaptar a la escala del equipo.
¿Cuáles son las reglas de oro de la gestión de ramas? ¿Cómo evitar el caos?
Convención de nombres:
• Prefijos unificados (feature/ desarrollo, bugfix/ correcciones, hotfix/ urgencias, release/ publicación)
• Número de tarea obligatorio (ej. feature/JIRA-1234-user-login)
• Palabras unidas con guiones -, no guiones bajos _ (convención habitual)
• Sin nombres de rama en chino (riesgo de visualización incorrecta en algunos sistemas)
• Sin caracteres especiales (espacios, @, etc.)

Ciclo de vida:
• Una rama feature no supera los 3 días (si no, dividir en varias features pequeñas)
• Eliminar la rama justo después del merge:
- git branch -d feature/xxx en local
- git push origin --delete feature/xxx en remoto
• Limpieza masiva: git branch --merged main | grep -v "main" | xargs git branch -d

Protección:
• En GitHub/GitLab: prohibir push directo a main, merge solo vía PR/MR
• Al menos 1 aprobación requerida
• CI obligatoria (tests unitarios, lint)
• Configuración: Settings → Branches → Branch protection rules
¿Qué diferencia hay entre Rebase y Merge? ¿Cuándo usar cada uno?
En resumen:

Merge:
• Como dos ríos que confluyen — se ve claramente dónde se unen
• Crea un merge commit; el árbol de historial muestra las bifurcaciones
• Conserva todo el historial, incluida la creación y fusión de ramas

Rebase:
• Como verter un afluente en el curso principal — un solo río lineal
• Reescribe el historial «moviendo» tus commits detrás de la rama destino — los IDs cambian
• Historial más limpio, pero se pierde el contexto de la rama

Casos de uso:
• Merge: fusión final feature → main, ramas compartidas, conservar historial de merge
• Rebase: feature retrasada respecto a main, ordenar tu rama personal (antes del push), historial lineal

Regla de oro:
• Nunca hagas rebase de commits ya pusheados en una rama compartida (IDs modificados → caos para los compañeros)

Principio: rebase libremente en local, piensa antes de hacer push.

Mejores prácticas 2025: rebase en local para ordenar el historial, merge para integrar en main.
¿Cómo prevenir y resolver conflictos de Git?
Prevención:

1) Sincronizar main al menos una vez al día:
• Al empezar la jornada: git checkout main && git pull origin main && git checkout feature/xxx && git merge main o git rebase main

2) Commits pequeños, merges rápidos:
• Rama feature ≤ 3 días — cuanto más viva, mayor el riesgo de conflicto

3) Comunicar antes de tocar los mismos archivos:
• Avisar al compañero si dos personas modifican el mismo archivo
• Tabla de «funcionalidades en desarrollo» (ej. Notion): quién modifica qué

Marcadores de conflicto:
• Entre <<<<<<< HEAD y =======: tu rama
• Entre ======= y >>>>>>>: la rama entrante
• Elegir qué conservar o combinar, luego eliminar los marcadores y git add . && git commit

Herramientas visuales:
• VS Code: Accept Current Change, Accept Incoming Change, Accept Both Changes, Compare Changes
• git mergetool + p4merge: comparación en tres columnas (base, tu versión, versión remota)

Tras resolver:
• Ejecutar tests en local
• git diff para verificar que no se borró código por error
• Pedir revisión a un compañero si es posible
¿Cómo establecer un proceso eficiente de revisión de código? ¿Mejores prácticas para PR?
Valor de la revisión:
• Compartir conocimiento (evitar silos de información)
• Calidad (un segundo par de ojos detecta lo que tú pasas por alto)
• Crecimiento técnico (leer buen código sigue siendo el mejor aprendizaje)

Mejores prácticas de PR:

1) Tamaño adecuado:
• Ideal: 200-400 líneas, máximo ~500
• PR demasiado grande = revisión superficial; dividir en varios PR

2) Descripción clara:
• Plantilla: contexto / cambios / tests / puntos de atención
• El revisor entiende rápido el qué y el porqué

3) Mensajes de commit:
• Conventional Commits con prefijo de tipo:
- feat/ nueva funcionalidad
- fix/ corrección de bug
- refactor/ refactorización
- docs/ documentación
• Permite generar changelog y localizar el historial

Roles:

Revisor:
• Responder en 24 h
• Comentarios constructivos («sugiero X porque…» en lugar de «está mal»)
• Centrarse en lógica, legibilidad, bugs — el estilo lo deja el lint

Autor:
• Responder a los comentarios
• Explicar las decisiones de diseño
• Escuchar sugerencias aunque al principio parezcan descabelladas
¿Cuáles son los errores frecuentes en la colaboración Git en equipo? ¿Cómo evitarlos?
Errores frecuentes:

1) Push forzado:
• git push -f / --force sobrescribe el historial remoto — muy peligroso
• Prohibido en main/master y cualquier rama compartida
• Preferir git push --force-with-lease (rechaza si hay commits nuevos en remoto)

2) Desarrollar directamente en main:
• Aunque sea un cambio mínimo: rama + PR para trazabilidad y rollback

3) Mensajes de commit vagos:
• «fix», «modif», «111», «asdf» — inútiles para el historial
• Describir claramente qué y por qué

4) No eliminar ramas ya fusionadas:
• Eliminar tras el merge; GitHub/GitLab pueden hacerlo automáticamente al fusionar el PR

5) git add . sin pensar:
• Añade todo, incluido .env con secretos
• Preferir git add -p (interactivo, más seguro)

Checklist de equipo:

Ramas: nomenclatura, número de tarea, ≤ 3 días, eliminación tras merge, protección de main

Commits: Conventional Commits, un tema por commit, lint/tests antes del push, sin secretos

Revisión: PR 200-400 líneas, descripción clara, ≥ 1 approve, CI en verde, respuesta < 24 h

Conflictos: sync diaria de main, tests tras resolver, comunicación

Prohibido: dev en main, push -f en ramas compartidas, rebase de commits ya pusheados en compartido, código sin probar

17 min de lectura · Publicado el: 24 nov 2025 · Actualizado el: 21 ago 2026

Comentarios

Inicia sesión con GitHub para dejar un comentario

Easton BlogEaston Blog