Ramas en Git (Branches)
Módulo 4: Ramas en Git (Branches)
Section titled “Módulo 4: Ramas en Git (Branches)”Las ramas son una de las características más poderosas de Git. Te permiten desarrollar funcionalidades, experimentar y colaborar sin afectar el código principal. En este módulo dominarás el trabajo con ramas.
¿Qué es una rama?
Section titled “¿Qué es una rama?”Una rama en Git es una línea independiente de desarrollo. Es como crear una copia del proyecto donde puedes hacer cambios sin afectar la rama principal.
Conceptos fundamentales
Section titled “Conceptos fundamentales”main: A---B---C---F---G \ /feature: D---E---/
A, B, C, D, E, F, G = commitsmain = rama principalfeature = rama de funcionalidadVentajas de las ramas:
- Desarrollo paralelo
- Experimentación segura
- Organización del trabajo
- Colaboración eficiente
Rama activa (HEAD):
- La rama en la que estás trabajando actualmente
- Los nuevos commits se agregan a esta rama
Ramas locales:
- Existen solo en tu repositorio local
- Puedes crear, modificar y eliminar libremente
Ramas remotas:
- Existen en el repositorio remoto (GitHub)
- Se sincronizan con push/pull
Ramas de seguimiento:
- Ramas locales que siguen ramas remotas
- Configuradas automáticamente con git clone
Crear, cambiar y eliminar ramas
Section titled “Crear, cambiar y eliminar ramas”Comandos básicos de ramas
Section titled “Comandos básicos de ramas”# Ver todas las ramasgit branch
# Ver ramas incluyendo remotasgit branch -a
# Ver ramas con último commitgit branch -v
# Crear nueva ramagit branch nueva-funcionalidad
# Crear y cambiar a nueva ramagit checkout -b nueva-funcionalidad
# Cambiar a rama existentegit checkout main
# Crear rama desde commit específicogit checkout -b hotfix abc1234Gestión avanzada de ramas
Section titled “Gestión avanzada de ramas”# Renombrar rama actualgit branch -m nuevo-nombre
# Renombrar rama específicagit branch -m viejo-nombre nuevo-nombre
# Eliminar rama (debe estar fusionada)git branch -d rama-terminada
# Forzar eliminación de ramagit branch -D rama-experimental
# Eliminar rama remotagit push origin --delete rama-remota
# Ver ramas fusionadasgit branch --merged
# Ver ramas no fusionadasgit branch --no-mergedTrabajar con ramas remotas
Section titled “Trabajar con ramas remotas”# Ver ramas remotasgit branch -r
# Crear rama local desde remotagit checkout -b local-branch origin/remote-branch
# Configurar rama local para seguir remotagit branch --set-upstream-to=origin/main main
# Push de nueva rama al remotogit push -u origin nueva-rama
# Sincronizar ramas remotasgit fetch --pruneFusionar ramas (git merge)
Section titled “Fusionar ramas (git merge)”Fusionar es el proceso de integrar cambios de una rama en otra.
Tipos de merge
Section titled “Tipos de merge”Antes del merge:main: A---B---C \feature: D---E
Después del merge:main: A---B---C---D---E# Fast-forward automáticogit checkout maingit merge feature
# Forzar fast-forward (falla si no es posible)git merge --ff-only feature
# Evitar fast-forward (crear commit de merge)git merge --no-ff featureAntes del merge:main: A---B---C---F \ /feature: D---E
Después del merge:main: A---B---C---F---M \ /feature: D---E---/
M = commit de merge# Three-way merge (automático)git checkout maingit merge feature
# Merge con mensaje personalizadogit merge feature -m "Merge feature: nueva funcionalidad"Estrategias de merge
Section titled “Estrategias de merge”# Merge normal (estrategia por defecto)git merge feature
# Merge recursivo (para casos complejos)git merge -s recursive feature
# Merge octopus (múltiples ramas)git merge rama1 rama2 rama3
# Merge sin commit automáticogit merge --no-commit feature
# Merge solo si es fast-forwardgit merge --ff-only featureResolver conflictos de fusión
Section titled “Resolver conflictos de fusión”Los conflictos ocurren cuando Git no puede fusionar automáticamente los cambios.
Identificar conflictos
Section titled “Identificar conflictos”# Intentar mergegit merge feature
# Si hay conflictos, Git mostrará:# Auto-merging archivo.txt# CONFLICT (content): Merge conflict in archivo.txt# Automatic merge failed; fix conflicts and then commit the result.
# Ver archivos con conflictosgit status
# Ver diferencias de conflictogit diffResolver conflictos manualmente
Section titled “Resolver conflictos manualmente”Abrir archivos con conflictos
# Los conflictos se marcan así:<<<<<<< HEADCódigo de la rama actual (main)=======Código de la rama que se está fusionando (feature)>>>>>>> featureEditar el archivo
- Eliminar marcadores de conflicto (
<<<<<<<,=======,>>>>>>>) - Decidir qué código mantener
- Combinar cambios si es necesario
- Eliminar marcadores de conflicto (
Marcar como resuelto
Terminal window # Después de editar el archivogit add archivo-resuelto.txt# Verificar estadogit statusCompletar el merge
Terminal window # Commit del mergegit commit# O abortar el mergegit merge --abort
Herramientas para resolver conflictos
Section titled “Herramientas para resolver conflictos”# Configurar herramienta de mergegit config --global merge.tool vimdiffgit config --global merge.tool meldgit config --global merge.tool vscode
# Usar herramienta de mergegit mergetool
# Ver configuración actualgit config --get merge.toolFlujo típico con ramas: main, dev, feature
Section titled “Flujo típico con ramas: main, dev, feature”Un flujo de trabajo bien estructurado mejora la organización y reduce conflictos.
Git Flow - Flujo tradicional
Section titled “Git Flow - Flujo tradicional”main: A---B---C---F---H---J \ / \ /develop: D---E---G---I \ /feature: X---YRamas principales:
main: Código en produccióndevelop: Integración de funcionalidades
Ramas de soporte:
feature/*: Nuevas funcionalidadeshotfix/*: Correcciones urgentesrelease/*: Preparación de versiones
# Inicializar Git Flowgit flow init
# Crear feature branchgit flow feature start nueva-funcionalidad
# Finalizar featuregit flow feature finish nueva-funcionalidad
# Crear release branchgit flow release start v1.0.0
# Finalizar releasegit flow release finish v1.0.0
# Crear hotfixgit flow hotfix start correccion-urgente
# Finalizar hotfixgit flow hotfix finish correccion-urgenteGitHub Flow - Flujo simplificado
Section titled “GitHub Flow - Flujo simplificado”# 1. Crear rama desde maingit checkout maingit pull origin maingit checkout -b feature/nueva-funcionalidad
# 2. Desarrollar funcionalidadgit add .git commit -m "feat: implementar nueva funcionalidad"git push -u origin feature/nueva-funcionalidad
# 3. Crear Pull Request en GitHub
# 4. Después del merge, limpiargit checkout maingit pull origin maingit branch -d feature/nueva-funcionalidadgit push origin --delete feature/nueva-funcionalidadFlujo personalizado recomendado
Section titled “Flujo personalizado recomendado”Rama main: Código estable en producción
Terminal window # main siempre debe estar estable# Solo se actualiza mediante Pull Requests# Protegida contra push directoRamas feature: Una por funcionalidad
Terminal window # Nomenclatura descriptivagit checkout -b feature/sistema-logingit checkout -b feature/dashboard-usuariogit checkout -b bugfix/corregir-validacionRamas hotfix: Correcciones urgentes
Terminal window # Para correcciones críticas en produccióngit checkout -b hotfix/seguridad-critica# Se fusiona tanto en main como en develop
Ejemplos prácticos completos
Section titled “Ejemplos prácticos completos”Ejemplo 1: Desarrollar nueva funcionalidad
Section titled “Ejemplo 1: Desarrollar nueva funcionalidad”Preparar entorno
Terminal window # Asegurar que main está actualizadogit checkout maingit pull origin main# Crear rama para funcionalidadgit checkout -b feature/sistema-comentariosDesarrollar funcionalidad
Terminal window # Crear archivos necesariostouch comentarios.js comentarios.css# Implementar funcionalidadecho "// Sistema de comentarios" > comentarios.jsecho "/* Estilos para comentarios */" > comentarios.css# Hacer commits incrementalesgit add comentarios.jsgit commit -m "feat: agregar lógica de comentarios"git add comentarios.cssgit commit -m "style: agregar estilos para comentarios"Sincronizar con main
Terminal window # Cambiar a main y actualizargit checkout maingit pull origin main# Volver a feature y rebasegit checkout feature/sistema-comentariosgit rebase mainSubir y crear PR
Terminal window # Push de la ramagit push -u origin feature/sistema-comentarios# Crear Pull Request en GitHub# Después del merge, limpiargit checkout maingit pull origin maingit branch -d feature/sistema-comentarios
Ejemplo 2: Resolver conflictos
Section titled “Ejemplo 2: Resolver conflictos”Simular conflicto
Terminal window # En maingit checkout mainecho "Versión main" > archivo.txtgit add archivo.txtgit commit -m "Actualizar archivo en main"# En featuregit checkout -b feature/conflictoecho "Versión feature" > archivo.txtgit add archivo.txtgit commit -m "Actualizar archivo en feature"Intentar merge
Terminal window git checkout maingit merge feature/conflicto# CONFLICT (content): Merge conflict in archivo.txtResolver conflicto
Terminal window # Ver contenido del archivocat archivo.txt# <<<<<<< HEAD# Versión main# =======# Versión feature# >>>>>>> feature/conflicto# Editar archivo para resolverecho "Versión combinada main + feature" > archivo.txt# Marcar como resueltogit add archivo.txtgit commit -m "resolve: combinar cambios de main y feature"
Comandos avanzados con ramas
Section titled “Comandos avanzados con ramas”Rebase interactivo
Section titled “Rebase interactivo”# Rebase interactivo de últimos 3 commitsgit rebase -i HEAD~3
# Opciones disponibles:# pick = usar commit# reword = cambiar mensaje# edit = editar commit# squash = combinar con anterior# drop = eliminar commit
# Rebase rama completa sobre maingit rebase main feature-branchCherry-pick
Section titled “Cherry-pick”# Aplicar commit específico a rama actualgit cherry-pick abc1234
# Cherry-pick múltiples commitsgit cherry-pick abc1234 def5678
# Cherry-pick rango de commitsgit cherry-pick abc1234..def5678
# Cherry-pick sin commit automáticogit cherry-pick --no-commit abc1234Stash para cambiar ramas rápidamente
Section titled “Stash para cambiar ramas rápidamente”# Guardar cambios temporalmentegit stash
# Cambiar de ramagit checkout otra-rama
# Volver y recuperar cambiosgit checkout rama-originalgit stash pop
# Ver lista de stashesgit stash list
# Aplicar stash específicogit stash apply stash@{1}Mejores prácticas con ramas
Section titled “Mejores prácticas con ramas”Nomenclatura de ramas
Section titled “Nomenclatura de ramas”# Prefijos recomendadosfeature/nombre-funcionalidadbugfix/descripcion-errorhotfix/correccion-urgenterelease/version-numeroexperiment/prueba-concepto
# Ejemplos específicosfeature/login-socialfeature/dashboard-adminbugfix/validacion-emailhotfix/seguridad-sql-injectionrelease/v2.1.0Estrategias de integración
Section titled “Estrategias de integración”Cuándo usar:
- Preservar contexto histórico
- Funcionalidades grandes
- Trabajo colaborativo
Ventajas:
- Historial completo
- Fácil revertir funcionalidad completa
- Menos conflictos
Desventajas:
- Historial más complejo
- Más commits de merge
Cuándo usar:
- Historial lineal
- Funcionalidades pequeñas
- Trabajo individual
Ventajas:
- Historial limpio y lineal
- Fácil seguimiento
- Sin commits de merge
Desventajas:
- Pierde contexto temporal
- Más propenso a conflictos
- No recomendado para ramas compartidas
Protección de ramas
Section titled “Protección de ramas”# En GitHub, configurar branch protection rules:# - Require pull request reviews# - Require status checks to pass# - Require branches to be up to date# - Require conversation resolution# - Restrict pushes to matching branches
# Localmente, crear hooks para validación# .git/hooks/pre-push#!/bin/bashif [ "$1" = "refs/heads/main" ]; then echo "Push directo a main no permitido" exit 1fiResumen
Section titled “Resumen”En este módulo has aprendido:
Ramas en Git- ✅ Concepto de ramas: Líneas independientes de desarrollo
- ✅ git branch: Crear, listar y eliminar ramas
- ✅ git checkout: Cambiar entre ramas
- ✅ git merge: Fusionar ramas y resolver conflictos
- ✅ Flujos de trabajo: Git Flow, GitHub Flow y flujos personalizados
- ✅ Comandos avanzados: Rebase, cherry-pick, stash
- ✅ Mejores prácticas: Nomenclatura, estrategias de integración
- ✅ Resolución de conflictos: Identificar, resolver y prevenir
En el próximo módulo aprenderemos sobre trabajo colaborativo, incluyendo forks, pull requests y las mejores prácticas para trabajar en equipo con Git y GitHub.