Git para principiantes: Imagina que llevas tres días trabajando en una nueva función para tu proyecto. Modificaste diez archivos, agregaste cientos de líneas de código… y de repente todo deja de funcionar. No sabes qué cambio lo rompió. No tienes manera de comparar cómo estaba antes. El proyecto entero está hecho un caos.
Eso exactamente es lo que les pasa a los programadores que no usan control de versiones. Y por eso Git existe.
Bienvenido a la guía que hubiera querido tener cuando empecé.
¿Qué es Git y por qué debería importarte?
Git es un sistema de control de versiones. En términos simples: es una herramienta que registra el historial completo de todos los cambios que haces en tu código — qué cambió, cuándo, quién lo hizo y por qué.
Pero más que eso, Git te da algo invaluable: tranquilidad. Puedes experimentar sin miedo, porque siempre puedes volver atrás. Puedes colaborar con otros sin pisarte los pies. Puedes entender, semanas después, por qué tomaste cierta decisión.
Git es como un cuaderno de bitácora del capitán de un barco: cada entrada registra exactamente qué pasó, cuándo y bajo qué circunstancias. Y si el barco empieza a hundirse, puedes volver a cualquier punto anterior en que todo estaba bien. Aunque si el barco se hunde puedes perder la bitácora, a menos, que la bitácora haya estado “en la nube”
Instalación: Lo Primero es Lo Primero
Antes de cualquier otra cosa, necesitas tener Git instalado.
En Windows: descarga el instalador desde git-scm.com y sigue los pasos. Obtendrás “Git Bash”, una terminal especial para usar Git.
En macOS: abre la Terminal y escribe:
Si no está instalado puedes hacerlo de la siguiente forma en MacOS usando brew
O de forma manual descargando el archivo tar.gz
Toda vez instalado, lo primero que debes hacer es presentarte:
git config --global user.name "Tu Nombre"
git config --global user.email "tu@email.com"Git usa esta información para saber quién hizo cada cambio. En un equipo, esto es fundamental.
Tu Primer Repositorio: “Hola, Git”
Un repositorio (o “repo”) es simplemente una carpeta de proyecto que Git está vigilando. Para crear uno:
mkdir mi-primer-proyecto
cd mi-primer-proyecto
git initCon git init le dices a Git: “oye, empieza a vigilar esta carpeta”. Verás que aparece una carpeta oculta llamada .git — ahí es donde Git guarda toda la historia. No la toques nunca manualmente, obviamente tampoco la borres a menos que desees volver a reinicializar un repositorio vacío.
Para ver el estado actual de tu repositorio en cualquier momento:
git statusEste comando será tu mejor amigo. Úsalo constantemente.
Los Conceptos Clave (Con Ejemplos Reales)
📸 Commit: La “Foto” de tu Código
Un commit es un punto de guardado. Cada vez que terminas algo concreto y funcional, haces un commit. Es como decir: “en este momento, todo está bien, guardo este estado”.
Ejemplo del mundo real: Estás construyendo una tienda online. Terminaste de hacer el formulario de login. Funciona. Ese es el momento perfecto para un commit.
git add . # "Quiero incluir todos estos archivos en mi foto"
git commit -m "Agregué formulario de login con validación de email"Ese mensaje entre comillas es tuyo. Los mensajes de commit importan — son la descripción de la foto. Dentro de un mes, cuando revises el historial, ese mensaje te dirá exactamente qué pasó.
Mensajes malos vs. buenos:
# ❌ Malos — no dicen nada útil
git commit -m "cambios"
git commit -m "arreglé cosas"
git commit -m "asdfjkl"
# ✅ Buenos — describen qué y, a veces, por qué
git commit -m "Corregí bug en cálculo de descuentos para productos en oferta"
git commit -m "Agregué paginación a la lista de productos"
git commit -m "Cambié color del botón a azul según feedback del cliente"Regla de oro: si no puedes describir tu commit en una línea clara, probablemente estás tratando de meter demasiado en un solo commit. Haz commits más pequeños y frecuentes.
🗂️ El Área de Staging: El Paso Intermedio
Git tiene un paso intermedio entre “modificar archivos” y “hacer commit” llamado el área de staging (o índice). Es donde seleccionas exactamente qué quieres incluir en tu próximo commit.
git add archivo.py # Agrega un archivo específico
git add carpeta/ # Agrega toda una carpeta
git add . # Agrega todo lo modificado¿Por qué existe este paso? Para darte control. Imagina que trabajaste en tres cosas distintas hoy y quieres hacer tres commits separados, uno para cada tema — el staging te permite escoger exactamente qué va en cada uno.
# Ver qué está en staging y qué no
git status
# Ver exactamente qué líneas cambiaron
git diff # Cambios no en staging
git diff --staged # Cambios que ya están en staging📜 El Historial: Tu Máquina del Tiempo
Para ver todos los commits que has hecho:
git logVerás algo así:
commit a3f8c21b9d...
Author: Juan García <juan@email.com>
Date: Mon Jun 9 14:32:00 2025
Agregué formulario de login con validación de email
commit 7b2e491...
Author: Juan García <juan@email.com>
Date: Sun Jun 8 10:15:00 2025
Creé la estructura inicial del proyectoUna vista más compacta y legible:
git log --onelinea3f8c21 Agregué formulario de login con validación de email
7b2e491 Creé la estructura inicial del proyectoEse código raro al inicio (a3f8c21) es el ID del commit. Lo necesitarás para viajar en el tiempo.
⏪ Volver Atrás: Cuando Todo Sale Mal
Esta es la funcionalidad que te salvará la vida más de una vez.
Escenario 1: Modificaste un archivo y quieres descartar los cambios
# Acabas de arruinar un archivo y quieres la versión del último commit
git restore index.htmlEscenario 2: Hiciste un commit pero el mensaje está mal o faltó algo
# Modifica el último commit (antes de subir al servidor)
git commit --amend -m "Mensaje corregido"Escenario 3: Quieres deshacer un commit específico de forma segura
# Esto crea un nuevo commit que "deshace" el anterior — la forma más segura
git revert a3f8c21Escenario 4: Quieres volver a ver cómo era el código hace N commits
# "Viaja en el tiempo" — solo para ver, no modifica nada
git checkout a3f8c21
# Para volver al presente:
git checkout mainEscenario 5: El caos es total — quiero borrar todo y partir desde el último commit
# ⚠️ CUIDADO: esto es irreversible, borra todos los cambios no guardados
git reset --hard HEAD🌿 Branches (Ramas): Universos Paralelos para Tu Código
Las ramas son donde Git se vuelve verdaderamente poderoso. Una rama es una línea de desarrollo independiente — puedes trabajar en ella sin afectar el código principal.
La analogía perfecta: piensa en las ramas como fotocopias de tu documento. Trabajas en la fotocopia. Si queda bien, reemplazas el original. Si no, botas la fotocopia.
Ejemplo real: Tu aplicación web está funcionando en producción (la están usando clientes reales). Te piden agregar un sistema de cupones de descuento. No puedes tocar el código en producción mientras lo desarrollas — podrías romper algo. La solución:
# Ver en qué rama estás actualmente
git branch
# Crear una nueva rama y moverse a ella
git checkout -b feature/cupones-descuento
# (o en Git moderno)
git switch -c feature/cupones-descuentoAhora estás en tu universo paralelo. Trabajas con total libertad:
# ... trabajas, trabajas, trabajas ...
git add .
git commit -m "Agregué tabla de cupones en la base de datos"
git add .
git commit -m "Implementé lógica de validación de cupones"
git add .
git commit -m "Conecté cupones con el proceso de checkout"La rama main (tu código en producción) no se tocó en ningún momento.
🔀 Merge: Uniendo los Mundos
Cuando tu feature está lista y probada, la unes a la rama principal:
git checkout main # Vuelves a la rama principal
git merge feature/cupones-descuento # Traes los cambios de tu featureGit es inteligente y combina los cambios automáticamente. Pero a veces dos personas modificaron la misma línea del mismo archivo — eso es un conflicto.
¿Cómo se ve un conflicto?
<<<<<<< HEAD
precio_final = precio * 0.9 # Tu versión
=======
precio_final = precio - descuento # La versión de tu compañero
>>>>>>> feature/cupones-descuentoGit te está diciendo: “aquí hay dos versiones distintas — tú decides cuál queda”. Editas el archivo, eliminas las marcas <<<<<<<, =======, >>>>>>>, dejas el código correcto, y haces un commit.
Los conflictos asustan al principio, pero con práctica se vuelven rutinarios.
🗑️ Limpieza: Borrando Ramas que Ya No Necesitas
Las ramas ya fusionadas deberían borrarse para mantener el repositorio ordenado:
git branch -d feature/cupones-descuento # Borra la rama (solo si ya fue fusionada)
git branch -D feature/cupones-descuento # Fuerza el borrado aunque no haya sido fusionadaGitHub: Git en la Nube y el Trabajo en Equipo
Git vive en tu computador. GitHub (o GitLab, Bitbucket) es donde subes ese repositorio a Internet. Esto te permite:
- Tener respaldo en la nube
- Colaborar con otras personas
- Mostrar tu trabajo (¡tu portafolio profesional!)
- Usar herramientas de revisión de código (Pull Requests)
Conectar tu Repositorio Local con GitHub
# Después de crear el repositorio vacío en github.com:
git remote add origin https://github.com/tuusuario/mi-proyecto.git
git push -u origin mainEl Ciclo Diario de Trabajo en Equipo
# Al empezar el día: bajar los cambios de tus compañeros
git pull origin main
# ... trabajas en tu rama ...
# Al terminar: subir tus cambios
git push origin feature/mi-nueva-funcionalidadPull Requests: La Revisión de Código
Cuando tu rama está lista para entrar a main, no la fusionas directamente — creas un Pull Request (PR) en GitHub. Es una solicitud que dice: “oye equipo, revisen mi código antes de aceptarlo”.
Tus compañeros pueden comentar, sugerir cambios, aprobar o rechazar. Es la herramienta más importante del trabajo colaborativo moderno.
Flujos de Trabajo: Cómo se Organiza un Equipo Real
Cuando trabajas solo, puedes hacer lo que quieras. Pero en equipo, necesitas un flujo acordado. El más común para principiantes es:
Feature Branch Workflow:
main ──●──────────────────────●── (producción siempre estable)
\ /
feature/login ──●──●──●──●──●──●── (desarrollo aislado)- Nunca se trabaja directamente en
main - Cada nueva funcionalidad o bug fix tiene su propia rama
- Cuando está lista, se hace Pull Request
- Alguien revisa el código
- Si está bien, se fusiona a
main
El .gitignore: Qué No Debería Entrar a Git
No todo debe versionarse. Las contraseñas, las configuraciones locales, las carpetas de dependencias (como node_modules en JavaScript) — eso no debería subir al repositorio.
El archivo .gitignore le dice a Git qué ignorar:
# Crear el archivo
touch .gitignoreContenido típico para un proyecto Python:
# Dependencias
venv/
__pycache__/
*.pyc
# Variables de entorno (¡nunca subas contraseñas!)
.env
# Archivos del sistema operativo
.DS_Store # macOS
Thumbs.db # Windows
# Configuración del editor
.vscode/
.idea/Regla crítica: el archivo .env (donde se guardan contraseñas, claves de API, credenciales de base de datos) NUNCA debe subirse a GitHub. Si lo haces por error, esas credenciales quedan expuestas públicamente. Agrega .env a tu .gitignore antes de hacer tu primer commit.
Comandos que Todo Junior Debería Memorizar
Una referencia rápida para el día a día:
# Estado y navegación
git status # ¿Qué está pasando ahora mismo?
git log --oneline # Historial resumido de commits
git diff # ¿Qué cambié exactamente?
# Guardar trabajo
git add . # Preparar todos los cambios
git add archivo.py # Preparar un archivo específico
git commit -m "Descripción" # Hacer el commit
# Ramas
git branch # Ver todas las ramas
git switch -c nombre-rama # Crear y moverse a nueva rama
git switch main # Volver a la rama principal
git merge nombre-rama # Fusionar una rama
# Trabajo remoto (GitHub)
git clone URL # Descargar un repositorio existente
git pull origin main # Bajar cambios del servidor
git push origin nombre-rama # Subir tus cambios
# Deshacer cosas
git restore archivo.py # Descartar cambios de un archivo
git revert ID-del-commit # Deshacer un commit de forma seguraErrores Comunes del Principiante (Y Cómo Resolverlos)
“Hice commit en la rama equivocada”
Hiciste trabajo en main en vez de en tu feature branch. Solución:
# Crea la rama donde debía ir el trabajo
git branch feature/mi-trabajo
# Vuelve main al estado anterior (sin perder los commits)
git reset --soft HEAD~1 # Deshace el último commit pero guarda los cambios
# Muévete a tu rama correcta y haz el commit ahí
git switch feature/mi-trabajo
git commit -m "El mensaje correcto"“Subí el archivo .env con mis contraseñas a GitHub”
Esto es serio. Primero, cambia todas las contraseñas y claves de API que estaban en ese archivo inmediatamente — asume que ya están comprometidas. Luego:
# Agrega .env al .gitignore
echo ".env" >> .gitignore
# Elimina el archivo del historial de Git (proceso más avanzado)
git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch .env' HEADPero lo mejor es que esto nunca pase: agrega .env al .gitignore antes de tu primer commit.
“Mi git pull tiene conflictos y no sé qué hacer”
Calma. Abre los archivos con conflicto (Git te los lista con git status), busca las marcas <<<<<<<, decide qué código queda, borra las marcas, y:
git add .
git commit -m "Resueltos conflictos del merge"“Perdí trabajo que no hice commit”
Malas noticias: si no hiciste commit, Git no puede ayudarte. Esta es la lección más dolorosa que aprende todo desarrollador. Haz commits frecuentes. Incluso commits de “trabajo en progreso”:
git commit -m "WIP: a medias con el formulario de pago"¿Y Qué Hay de Nuevo? Las Tecnologías que Vienen Después de Git
Git lleva más de 20 años con nosotros y sigue siendo el estándar absoluto. Pero el mundo del desarrollo no se detiene, y hay proyectos interesantes que buscan mejorar — o directamente reemplazar — algunos de sus aspectos más incómodos.
🔷 Jujutsu (jj): El Aspirante Más Serio
Desarrollado por Google, Jujutsu es probablemente la innovación más interesante en este espacio. La gran noticia para ti: es compatible con repositorios Git existentes. Puedes usarlo mañana mismo sobre cualquier proyecto actual.
¿Qué mejora?
El staging area desaparece. Ese paso intermedio del git add que confunde a todos al principio — en Jujutsu no existe. Simplemente haces cambios y los confirmas:
# En Git: dos pasos
git add .
git commit -m "Mi cambio"
# En Jujutsu: un solo paso
jj commit -m "Mi cambio"El historial es más fácil de reescribir. En Git, modificar commits pasados requiere comandos intimidantes como git rebase -i. En Jujutsu, editar cualquier commit del historial es tan natural como editar el último.
Los conflictos no bloquean tu trabajo. En Git, si hay un conflicto durante un merge, Git se detiene y espera que lo resuelvas ahora mismo. Jujutsu registra el conflicto pero te deja seguir trabajando — lo resuelves cuando puedas.
Para un principiante, Jujutsu sería una experiencia considerablemente más amable. Está ganando tracción rápidamente entre desarrolladores avanzados que buscan un flujo más limpio.
🔶 Sapling: La Apuesta de Meta
Meta (Facebook) liberó su sistema interno bajo el nombre Sapling. Está diseñado para monorepos — repositorios con millones de líneas de código, decenas de miles de archivos y cientos de desarrolladores trabajando simultáneamente. También compatible con Git.
¿Por qué lo menciono? Porque muestra cuáles son los límites de Git cuando escala a dimensiones extremas. Para un equipo pequeño o un proyecto personal, Git funciona perfectamente. Pero cuando tienes el tamaño de Meta o Google, necesitas algo diseñado para esa escala.
🔹 Pijul: El Experimento Académico
Pijul toma un enfoque matemáticamente distinto: en lugar de guardar “fotos” del estado del código como hace Git, trabaja con teoría de parches — una forma de representar los cambios que, en teoría, elimina ciertos tipos de conflictos de raíz.
Es fascinante como idea, pero hoy por hoy es más un proyecto académico que una herramienta de producción. Sus ideas, sin embargo, están influyendo en el diseño de los sistemas que vienen.
La Conclusión Honesta
Para hoy, mañana, y probablemente los próximos cinco años de tu carrera: aprende Git. No hay atajos. Es el estándar universal que encontrarás en absolutamente cualquier trabajo de desarrollo, proyecto colaborativo, o entrevista técnica.
La curva de aprendizaje es real, pero no es tan empinada como parece. Los primeros días se sienten raros. A la semana ya fluye. Al mes ya no puedes imaginar trabajar sin él.
Si eres curioso y quieres explorar lo que viene, Jujutsu vale absolutamente la pena probarlo — y tiene la gran ventaja de que puedes usarlo sobre tus repositorios Git existentes sin cambiar nada.
El control de versiones es una de esas herramientas que separa a alguien que “sabe programar” de alguien que “sabe trabajar como programador profesional”. Empezar hoy es el mejor momento.
Recursos Para Ir Más Lejos
- learngitbranching.js.org — Aprende Git de forma visual e interactiva. El mejor recurso para principiantes, sin discusión.
- git-scm.com/book — El libro oficial de Git, disponible gratis en español.
- github.com — Crea tu cuenta gratuita y empieza a construir tu portafolio.
- ohshitgit.com — Soluciones directas para cuando Git te tiene desesperado (hay una versión sin palabrotas también).
- jj-vcs.github.io/jj — Documentación de Jujutsu, si quieres explorar el futuro.
¿Quedaste con alguna duda? ¿Hay algún error que te está volviendo loco y no aparece aquí? Déjalo en los comentarios — entre todos aprendemos.
— Juanjo Blog