Git

TOOLSIntermedio
⏱️ 5 min de lectura🏷️ version-control, collaboration, development

Git

Git es un sistema de control de versiones distribuido que permite rastrear cambios en archivos y coordinar el trabajo entre múltiples desarrolladores.

¿Qué es Git?

Imagina que escribes un documento importante que varios editores necesitan revisar - quieres un sistema que mantenga todas las versiones, permita que cada editor trabaje sin interferir con otros, y luego combine todos los cambios de manera organizada.

Git es exactamente eso, pero para código. Es un sistema que rastrea cada cambio en tus archivos, permite que múltiples programadores trabajen en el mismo proyecto sin pisarse los pies, y mantiene un historial completo de todo lo que ha pasado.

Git te permite:

  • Viajar en el tiempo - Ver cómo era tu código en cualquier momento del pasado
  • Trabajar en paralelo - Crear "ramas" para experimentar sin afectar el código principal
  • Colaborar sin caos - Varios desarrolladores pueden trabajar simultáneamente
  • Recuperarte de errores - Volver a versiones anteriores si algo sale mal
  • Experimentar con seguridad - Probar ideas nuevas sin riesgo

Es como tener un sistema de backup inteligente que también entiende cómo colaborar con otros y organizar el trabajo en equipo.

Conceptos Fundamentales

Repository (Repositorio)

Contenedor que almacena todo el historial del proyecto.

Working Directory

Directorio local donde trabajas con los archivos.

Staging Area (Index)

Área intermedia donde preparas cambios para commit.

Commit

Snapshot del estado del proyecto en un momento específico.

Branch (Rama)

Línea independiente de desarrollo.

Merge

Combinación de cambios de diferentes ramas.

Configuración Inicial

# Configurar identidad
git config --global user.name "Tu Nombre"
git config --global user.email "[email protected]"

# Ver configuración
git config --list

# Configurar editor por defecto
git config --global core.editor "code --wait"

# Configurar alias útiles
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.cm commit

Comandos Básicos

Inicializar y Clonar

# Inicializar repositorio nuevo
git init

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

# Clonar con nombre específico
git clone https://github.com/usuario/repo.git mi-proyecto

Tracking y Staging

# Ver estado de archivos
git status

# Añadir archivos al staging
git add archivo.txt
git add .                    # Todos los archivos
git add *.js                 # Archivos JavaScript
git add src/                 # Directorio completo

# Quitar del staging
git reset archivo.txt

# Ver diferencias
git diff                     # Working vs Staging
git diff --staged            # Staging vs último commit
git diff HEAD                # Working vs último commit

Commits

# Hacer commit
git commit -m "Mensaje descriptivo del cambio"

# Commit con descripción extendida
git commit -m "Título corto" -m "Descripción más detallada"

# Commit saltando staging (archivos ya tracked)
git commit -am "Mensaje del commit"

# Modificar último commit
git commit --amend -m "Nuevo mensaje"

# Ver historial
git log
git log --oneline            # Formato compacto
git log --graph              # Con gráfico
git log --author="Nombre"     # Por autor

Trabajo con Ramas

Crear y Cambiar Ramas

# Ver ramas
git branch                   # Ramas locales
git branch -r                # Ramas remotas
git branch -a                # Todas las ramas

# Crear rama nueva
git branch nueva-feature

# Cambiar de rama
git checkout nueva-feature

# Crear y cambiar en un comando
git checkout -b nueva-feature

# Cambiar a rama anterior
git checkout -

# Renombrar rama
git branch -m viejo-nombre nuevo-nombre

# Eliminar rama
git branch -d rama-terminada
git branch -D rama-forzar    # Forzar eliminación

Merging

# Hacer merge (desde la rama destino)
git checkout main
git merge nueva-feature

# Merge sin fast-forward
git merge --no-ff nueva-feature

# Resolver conflictos
# 1. Editar archivos en conflicto
# 2. Añadir archivos resueltos
git add archivo-conflicto.txt
# 3. Completar merge
git commit

Trabajo con Remotos

Configurar Remotos

# Ver remotos
git remote -v

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

# Cambiar URL del remoto
git remote set-url origin nueva-url

# Eliminar remoto
git remote remove origin

Sincronizar con Remotos

# Obtener cambios sin merge
git fetch origin

# Obtener y hacer merge
git pull origin main

# Enviar cambios
git push origin main

# Enviar nueva rama
git push -u origin nueva-feature

# Enviar todos los tags
git push --tags

Comandos Avanzados

Stashing

# Guardar cambios temporalmente
git stash
git stash -m "Mensaje descriptivo"

# Ver stashes
git stash list

# Aplicar último stash
git stash pop

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

# Eliminar stash
git stash drop stash@{1}

# Limpiar todos los stashes
git stash clear

Rebase

# Rebase interactivo
git rebase -i HEAD~3         # Últimos 3 commits

# Rebase una rama
git checkout feature-branch
git rebase main

# Continuar rebase después de resolver conflictos
git rebase --continue

# Abortar rebase
git rebase --abort

Reset y Revert

# Reset suave (mantiene cambios en staging)
git reset --soft HEAD~1

# Reset mixto (mantiene cambios en working)
git reset HEAD~1

# Reset duro (elimina todos los cambios)
git reset --hard HEAD~1

# Revertir commit (crea nuevo commit)
git revert commit-hash

Buenas Prácticas

Mensajes de Commit

Formato recomendado:

type(scope): descripción breve

Descripción más detallada si es necesario.

Ejemplos:
feat(auth): agregar login con Google
fix(api): corregir error en validación de email
docs(readme): actualizar instrucciones de instalación
refactor(utils): simplificar función de formateo

Tipos de Commit

  • feat: Nueva funcionalidad
  • fix: Corrección de bug
  • docs: Documentación
  • style: Formato, espacios, etc.
  • refactor: Refactorización de código
  • test: Añadir o modificar tests
  • chore: Tareas de mantenimiento

Workflow con Ramas

Git Flow:
main/master    → Producción
develop        → Desarrollo
feature/*      → Nuevas funcionalidades
release/*      → Preparación de releases
hotfix/*       → Correcciones urgentes

.gitignore

# Dependencias
node_modules/
vendor/

# Archivos de entorno
.env
.env.local
.env.production

# Logs
logs/
*.log

# Archivos temporales
*.tmp
*.temp

# IDEs
.vscode/
.idea/
*.swp

# Archivos del sistema
.DS_Store
Thumbs.db

# Build
build/
dist/

# Archivos específicos del proyecto
config/secrets.js
uploads/

Git Hooks

# Pre-commit hook (ejecuta antes del commit)
#!/bin/sh
# .git/hooks/pre-commit

# Ejecutar linter
npm run lint
if [ $? -ne 0 ]; then
  echo "Error en linting. Commit abortado."
  exit 1
fi

# Ejecutar tests
npm test
if [ $? -ne 0 ]; then
  echo "Tests fallaron. Commit abortado."
  exit 1
fi

Relacionado