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

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 funcionalidadesbugfix/— corrección de bugshotfix/— corrección urgenterelease/— 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 commitsquashos— fusionar con el anteriorrewordor— cambiar el mensajeeditoe— pausar para editar contenidodropod— 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
<<<<<<< HEADy=======: 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:
- Ejecuto tests en local
- Reviso con
git diffque no haya borrados accidentales - 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 usuariofix: corregir validación de contraseñarefactor: refactorizar capa de servicio de usuariodocs: 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 -fen 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:
- Atlassian Git Tutorial — tutorial muy completo
- Libro Pro Git — oficial, gratis en línea
- GitKraken o SourceTree — clientes visuales, más amigables para empezar
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
Step 1: Elegir el flujo de trabajo Git adecuado
Según el tamaño del equipo: -
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
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
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
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
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?
• 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?
• 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?
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?
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?
• 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?
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