Git

Sistema de control de versiones distribuido

Fundamentos de Git

Git es un sistema de control de versiones distribuido diseñado para manejar proyectos de cualquier tamaño con velocidad y eficiencia. Fue creado por Linus Torvalds en 2005 para el desarrollo del kernel de Linux.

Conceptos Básicos

  • Repositorio: Almacén de archivos de un proyecto y su historial de cambios
  • Commit: Instantánea de los cambios realizados en un momento específico
  • Rama (Branch): Línea independiente de desarrollo
  • Fusión (Merge): Combinación de cambios de diferentes ramas
  • Clon: Copia completa de un repositorio
  • Pull/Push: Descargar/Subir cambios a un repositorio remoto

Configuración Inicial

# Configurar nombre de usuario
git config --global user.name "Tu Nombre"

# Configurar email
git config --global user.email "tu@email.com"

# Verificar configuración
git config --list

Comandos Esenciales

Estos son los comandos de Git que utilizarás con más frecuencia en tu flujo de trabajo diario.

ComandoDescripción
git initInicializa un nuevo repositorio Git
git clone [url]Clona un repositorio existente
git add [archivo]Añade archivos al área de preparación
git commit -m "[mensaje]"Guarda los cambios en el repositorio
git statusMuestra el estado del repositorio
git pullObtiene cambios del repositorio remoto
git pushEnvía cambios al repositorio remoto

Ramas y Fusiones

Las ramas (branches) en Git permiten desarrollar funcionalidades aisladas del código principal. Esto facilita el trabajo en equipo y la organización del desarrollo.

Trabajando con Ramas

# Crear una nueva rama
git branch nueva-funcionalidad

# Cambiar a la nueva rama
git checkout nueva-funcionalidad

# Crear y cambiar a una nueva rama (atajo)
git checkout -b nueva-funcionalidad

# Ver todas las ramas
git branch

# Ver ramas remotas
git branch -r

# Eliminar una rama
git branch -d nombre-rama

Fusionando Ramas

La fusión (merge) permite combinar los cambios de una rama con otra.

# Cambiar a la rama destino
git checkout main

# Fusionar la rama con la actual
git merge nueva-funcionalidad

# Fusión con mensaje personalizado
git merge nueva-funcionalidad -m "Fusionando nueva funcionalidad"

Resolviendo Conflictos

Los conflictos ocurren cuando Git no puede fusionar automáticamente los cambios porque hay modificaciones en las mismas líneas de código.

# Cuando ocurre un conflicto, Git marca los archivos
# Edita los archivos para resolver los conflictos manualmente

# Después de resolver, marca como resuelto
git add archivo-con-conflicto.js

# Continúa con la fusión
git merge --continue

# O aborta la fusión si es necesario
git merge --abort

Flujos de Trabajo

Los flujos de trabajo en Git son patrones recomendados para organizar el desarrollo en equipo. Existen varios modelos que se adaptan a diferentes necesidades.

Flujo de Trabajo Centralizado

Similar a los sistemas de control de versiones centralizados, pero con las ventajas de Git.

  • Una rama principal (main/master)
  • Todos los desarrolladores trabajan directamente en esta rama
  • Ideal para equipos pequeños y proyectos simples

Flujo de Trabajo Feature Branch

Cada nueva funcionalidad se desarrolla en una rama separada.

  • Rama principal protegida (main/master)
  • Ramas de funcionalidades para cada nueva característica
  • Fusión mediante Pull Requests o Merge Requests
  • Facilita la revisión de código

Gitflow

Un modelo más estructurado con ramas específicas para diferentes propósitos.

  • master: Código en producción
  • develop: Código en desarrollo
  • feature/: Nuevas funcionalidades
  • release/: Preparación para lanzamientos
  • hotfix/: Correcciones urgentes en producción
# Iniciar una nueva funcionalidad
git checkout -b feature/nueva-funcionalidad develop

# Finalizar una funcionalidad
git checkout develop
git merge --no-ff feature/nueva-funcionalidad
git branch -d feature/nueva-funcionalidad

# Crear una rama de lanzamiento
git checkout -b release/1.0.0 develop

# Finalizar un lanzamiento
git checkout master
git merge --no-ff release/1.0.0
git tag -a 1.0.0 -m "Versión 1.0.0"
git checkout develop
git merge --no-ff release/1.0.0
git branch -d release/1.0.0

GitHub y GitLab

GitHub y GitLab son plataformas de alojamiento para repositorios Git que añaden funcionalidades de colaboración y gestión de proyectos.

Trabajando con Repositorios Remotos

# Clonar un repositorio
git clone https://github.com/usuario/repositorio.git

# Ver repositorios remotos
git remote -v

# Añadir un repositorio remoto
git remote add origin https://github.com/usuario/repositorio.git

# Cambiar la URL del remoto
git remote set-url origin https://github.com/usuario/nuevo-repo.git

# Obtener cambios sin fusionar
git fetch origin

# Obtener cambios y fusionar
git pull origin main

Pull Requests / Merge Requests

Las Pull Requests (GitHub) o Merge Requests (GitLab) permiten proponer cambios, revisar código y discutir modificaciones antes de fusionarlas.

  1. Crea una rama para tu funcionalidad
  2. Realiza los cambios y haz commits
  3. Sube la rama al repositorio remoto
  4. Crea una Pull Request/Merge Request desde la interfaz web
  5. Discute y revisa los cambios
  6. Fusiona los cambios cuando estén aprobados

Características Adicionales

  • Issues: Seguimiento de tareas, errores y solicitudes
  • Wikis: Documentación colaborativa
  • Actions/CI/CD: Automatización de pruebas y despliegues
  • Projects: Gestión de proyectos con tableros Kanban
  • Discussions: Foros para discusiones del proyecto

Técnicas Avanzadas

Git ofrece herramientas avanzadas para gestionar el historial, depurar problemas y optimizar el flujo de trabajo.

Rebase

El rebase permite reorganizar el historial de commits, creando una línea de tiempo más limpia.

# Rebase básico
git checkout feature
git rebase main

# Rebase interactivo
git rebase -i HEAD~3  # Reorganizar los últimos 3 commits

⚠️ Nunca hagas rebase de ramas que ya has compartido con otros. Esto reescribe el historial y puede causar problemas.

Cherry-pick

Cherry-pick permite aplicar commits específicos a la rama actual.

# Aplicar un commit específico a la rama actual
git cherry-pick abc123

# Aplicar varios commits
git cherry-pick abc123 def456

# Cherry-pick sin crear un commit
git cherry-pick abc123 --no-commit

Stash

El stash permite guardar temporalmente cambios sin hacer commit, útil para cambiar de contexto rápidamente.

# Guardar cambios en el stash
git stash

# Guardar con un mensaje
git stash save "Cambios en progreso para la funcionalidad X"

# Ver lista de stashes
git stash list

# Aplicar el último stash
git stash apply

# Aplicar un stash específico
git stash apply stash@{2}

# Aplicar y eliminar el último stash
git stash pop

# Eliminar un stash
git stash drop stash@{1}

Bisect

Git bisect ayuda a encontrar el commit que introdujo un error mediante búsqueda binaria.

# Iniciar bisect
git bisect start

# Marcar el commit actual como malo
git bisect bad

# Marcar un commit anterior como bueno
git bisect good abc123

# Git seleccionará commits intermedios para probar
# Después de probar, marcar como bueno o malo
git bisect good  # o git bisect bad

# Finalizar bisect
git bisect reset