Introducción a Git

Una herramienta esencial para el desarrollo de software

1. Introducción a Git

¿Qué es Git?

Git es un sistema de control de versiones distribuido diseñado para:

  • Rastrear cambios en archivos
  • Coordinar el trabajo entre múltiples personas
  • Mantener un historial completo del proyecto
  • Permitir volver a estados anteriores

Historia breve

  • Creado por Linus Torvalds en 2005 para el desarrollo del kernel de Linux
  • Surgió como alternativa a herramientas propietarias y centralizadas
  • Hoy es el estándar de la industria para control de versiones

Diferencias con otros sistemas

Sistemas centralizados (SVN, CVS):

  • Dependen de un servidor central
  • Requieren conexión constante
  • Operaciones más lentas

Git (distribuido):

  • Cada desarrollador tiene una copia completa del repositorio
  • Permite trabajo sin conexión
  • Mayor velocidad y flexibilidad

2. Conceptos básicos de Git

Repositorios

  • Repositorio: Colección de archivos y su historial de cambios
  • Local: En tu máquina personal
  • Remoto: Alojado en un servidor (GitHub, GitLab, etc.)

Ciclo de trabajo básico

  1. Modificar archivos en tu directorio de trabajo
  2. Seleccionar archivos para la próxima versión (staging)
  3. Confirmar los cambios (commit)
  4. Sincronizar con repositorios remotos (push/pull)

Áreas de trabajo en Git

  1. Working directory: Donde modificas tus archivos
  2. Staging area (index): Preparación para el próximo commit
  3. Local repository: Historial de commits en tu máquina
  4. Remote repository: Versión compartida en el servidor

3. Configuración y comandos esenciales

Configuración inicial

# Configuración global
git config --global user.name "Tu Nombre"
git config --global user.email "tu.email@ejemplo.com"

# Configuración del repositorio actual
git config user.name "Tu Nombre"
git config user.email "tu.email@ejemplo.com"

Iniciar un repositorio

# Crear un nuevo repositorio
git init

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

Comandos básicos

# Ver estado de archivos
git status

# Añadir archivos al staging area
git add archivo.txt    # Archivo específico
git add .              # Todos los archivos

# Confirmar cambios
git commit -m "Mensaje descriptivo del cambio"
git commit -a -m "Añadir y confirmar en un paso"

# Ver historial de commits
git log
git log --oneline      # Formato resumido
git log --graph        # Con representación gráfica

4. Trabajo con ramas (branches)

Concepto de ramificación

  • Las ramas permiten desarrollar funcionalidades aisladas
  • Facilitan el trabajo en paralelo
  • Permiten experimentar sin afectar el código principal

Comandos para ramas

# Ver ramas existentes
git branch

# Crear nueva rama
git branch nueva-funcionalidad

# Cambiar a una rama
git checkout nueva-funcionalidad
git switch nueva-funcionalidad    # Git moderno

# Crear y cambiar en un paso
git checkout -b nueva-funcionalidad

# Fusionar ramas
git checkout main
git merge nueva-funcionalidad

# Eliminar rama
git branch -d nueva-funcionalidad

Resolución de conflictos

  1. Git marca los conflictos en los archivos
  2. Edita manualmente los archivos para resolver
  3. Añade los archivos resueltos con git add
  4. Completa el merge con git commit

5. Colaboración con Git

Repositorios remotos

# Ver repositorios remotos
git remote -v

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

# Eliminar repositorio remoto
git remote remove origin

Comandos para colaboración

# Obtener cambios sin integrarlos
git fetch origin

# Obtener e integrar cambios
git pull origin main

# Enviar cambios locales al remoto
git push origin main

# Establecer upstream para simplificar comandos
git push -u origin main

Pull Requests (GitHub/GitLab)

  1. Fork del repositorio (opcional)
  2. Crea una rama para tu funcionalidad
  3. Realiza y confirma cambios
  4. Envía la rama al repositorio remoto
  5. Crea el Pull/Merge Request a través de la interfaz web
  6. Discusión, revisión y aprobación

6. Flujos de trabajo comunes

Gitflow

  • main/master: Código de producción estable
  • develop: Integraciones para próxima versión
  • feature/x: Funcionalidades específicas
  • release/x.y: Preparación para lanzamiento
  • hotfix/x: Correcciones urgentes

GitHub Flow

  1. Crear rama desde main
  2. Añadir commits
  3. Abrir Pull Request
  4. Discutir y revisar
  5. Desplegar para pruebas
  6. Fusionar a main

Trunk-based development

  • Todos trabajan en la rama principal
  • Commits pequeños y frecuentes
  • Uso de feature flags para ocultar funcionalidades incompletas
  • Integración continua constante

7. Comandos avanzados y herramientas

Comandos avanzados

# Guardar cambios temporalmente
git stash
git stash pop

# Reescribir historia
git rebase main
git rebase -i HEAD~3

# Etiquetas para versiones
git tag v1.0.0
git tag -a v1.0.0 -m "Versión 1.0.0"

# Cherry-pick para aplicar commits específicos
git cherry-pick abc123

# Revertir commits
git revert abc123

.gitignore

Archivo para especificar qué archivos no deben versionarse:

# Ejemplos de .gitignore
node_modules/
*.log
.env
.DS_Store

Herramientas visuales

  • IDE integrados: VS Code, IntelliJ, etc.
  • GUI específicas: GitKraken, SourceTree, GitHub Desktop
  • Extensiones de terminal: lazygit, tig

8. Resumen de comandos Git

Comandos por área de trabajo:

Workspace Staging/Index Local Repo Remote Repo
git add git commit git push git fetch
git rm git commit -a git pull git clone
git mv git reset git merge git remote
git checkout git reset --hard git checkout git pull
git stash git rm --cached git rebase git push --force

9. Demo práctica

Escenario: Creación y colaboración en un proyecto

Paso 1: Configuración inicial

# Configurar Git
git config --global user.name "Tu Nombre"
git config --global user.email "tu@email.com"

# Crear directorio del proyecto
mkdir proyecto-demo
cd proyecto-demo

Paso 2: Iniciar repositorio y primer commit

# Inicializar repositorio
git init

# Crear archivo README
echo "# Proyecto Demo" > README.md

# Verificar estado
git status

# Añadir al staging
git add README.md

# Crear primer commit
git commit -m "feat: primer commit del proyecto"

Paso 3: Desarrollo en ramas

# Crear rama para nueva funcionalidad
git checkout -b feature/nueva-funcionalidad

# Crear archivo para la funcionalidad
echo "function nuevaFuncionalidad() {}" > funcionalidad.js

# Añadir y commitear
git add funcionalidad.js
git commit -m "feat: implementa nueva funcionalidad"

# Volver a la rama principal
git checkout main

# Fusionar cambios
git merge feature/nueva-funcionalidad

Paso 4: Trabajando con remotos

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

# Enviar cambios al remoto
git push -u origin main

# Simular trabajo de otro desarrollador
# (En un directorio diferente)
git clone https://github.com/usuario/proyecto-demo.git
cd proyecto-demo
echo "# Nueva sección" >> README.md
git add README.md
git commit -m "docs: actualiza README"
git push origin main

# Volver al repositorio original
cd ../proyecto-demo
git pull origin main

Paso 5: Resolución de conflictos

# Crear conflicto intencionalmente
echo "# MI versión del README" > README.md
git add README.md
git commit -m "docs: actualiza README con mi versión"

# Intentar pull (generará conflicto)
git pull origin main

# Resolver conflicto manualmente
# (Editar archivo README.md)
git add README.md
git commit -m "fix: resuelve conflicto en README"
git push origin main

10. Call to Action: Buenas Prácticas en Nuvu

Repository management & CI Automatization

En nuvu hemos establecido lineamientos oficiales para:

  • Control estricto de versiones
  • Flujos de trabajo con Git
  • Convenciones de commits
  • Proceso CI/CD
  • Integración con SonarQube
  • Métricas y umbrales de calidad

Consulta el documento completo en nuestro repositorio:

¡Gracias!

¿Preguntas?

Introducción a Git

By Juan G

Introducción a Git

  • 12