Git en 10 Minutos

La mayoría de tutoriales de Git te enseñan comandos. Luego escribes uno en el estado equivocado, Git imprime un párrafo de pesadilla, y copias tu proyecto a una carpeta nueva y empiezas de cero. Esta página enseña el modelo primero — tres árboles, ramas como post-its — porque una vez que tienes el modelo, los comandos son obvios y las pesadillas se vuelven aburridas.

🎙️ Publicado y grabado:

01El modelo: tres árboles, snapshots no diffs

Cada comando de Git mueve archivos entre tres sitios: tu directorio de trabajo (los archivos que editas), el staging area (un muelle de carga para la siguiente foto), y el repositorio (el álbum de fotos permanente). Y un commit es una foto completa de tu proyecto, no un diff. Entiende estos dos hechos y la mitad de la rareza de Git se evapora.

# los tres árboles, de izquierda a derecha:
#  working dir  --add-->  staging  --commit-->  repository

git init                # empezar a trackear esta carpeta
git status              # ¿dónde está todo ahora mismo?
Te va a pasar esto
fatal: not a git repository (or any of the parent directories): .git
Estás en la carpeta equivocada — Git busca un directorio oculto .git aquí y hacia arriba. Haz cd a tu proyecto real (la carpeta donde ejecutaste git init o git clone). Los principiantes se topan con esto cuando abren una terminal nueva que arranca en el directorio home.

02El ciclo diario: status → add → commit

El noventa por ciento de la vida con Git es un bucle de tres pasos. Ejecuta git status obsesivamente — antes y después de cada comando. Es gratis, es instantáneo, y te dice en qué árbol están tus cambios. Nadie senior se avergüenza de lo seguido que lo escribe.

git status                     # 1. ¿qué cambió?
git add main.py                # 2. ponerlo en el muelle de carga
git add .                      #    (o stagear todo lo de abajo)
git commit -m "Fix login bug"  # 3. tomar la foto

git log --oneline              # el álbum, una línea por foto
Te va a pasar esto
Changes not staged for commit
Editaste un archivo después de añadirlo, luego hiciste commit — y las ediciones más nuevas no entraron. add copia el archivo tal como está en ese momento. Editar de nuevo → add de nuevo. Esta es la ilusión #1 de "Git se comió mi cambio"; el cambio sigue en tu directorio de trabajo, solo que no en el commit.

03Las ramas son post-its, no carpetas

Una rama no es una copia de tu código. Es un post-it apuntando a un commit — 41 bytes. Cuando haces commit, el post-it donde estás parado se mueve hacia adelante. Por eso crear una rama es instantáneo, y por eso deberías crearlas sin miedo. HEAD es simplemente "el post-it donde estás parado ahora."

git switch -c try-new-parser   # escribir un post-it, pararte en él
# ...trabaja, haz commits como siempre...

git switch main                # volver — tus archivos cambian en disco
git merge try-new-parser       # traer el experimento a main
git branch -d try-new-parser   # tirar el post-it (los commits quedan)
Opinión honesta
Los tutoriales viejos dicen git checkout para todo. Ignóralos — checkout son tres herramientas distintas usando un solo nombre, y así es como la gente termina en detached HEAD (sección 07). Git moderno lo dividió: switch para ramas, restore para archivos. Usa esas dos palabras y escribirás checkout quizás una vez al año.

04Push y pull: tu repo tiene un gemelo

GitHub guarda una copia completa del repositorio, apodada origin. push manda tus snapshots nuevos arriba; pull baja los snapshots de tus compañeros. Eso es todo. El famoso error de rechazo asusta a todos una vez — y su solución es un hábito: pull antes de push.

git clone https://github.com/user/repo.git   # copiar + conectar origin
git pull                       # traer lo último antes de empezar
git push                       # publicar tus commits

git push -u origin my-branch   # primer push de una rama nueva
Te va a pasar esto
! [rejected] main -> main (non-fast-forward)
error: failed to push some refs

No está roto — Git se niega a sobreescribir el trabajo de un compañero. Alguien hizo push mientras tú trabajabas. Ejecuta git pull (fusiona sus snapshots con los tuyos), resuelve cualquier conflicto, push de nuevo. Hagas lo que hagas, no uses --force en una rama compartida; así es como desaparecen las tardes de tus compañeros.

05Deshacer cualquier cosa: la tabla de rescate

"¿Cómo deshago ___ en Git?" es la pregunta más buscada en software. Aquí está la respuesta completa, organizada por lo que quieres deshacer. Una regla primero: si el commit ya fue pusheado, usa revert (añade un anti-commit) en vez de reset (reescribe la historia bajo los pies de tus compañeros).

# quitar un archivo del staging (conservar las ediciones)
git restore --staged secret.txt

# tirar MIS EDICIONES de un archivo — cuidado, se pierden de verdad
git restore oops.py

# rehacer el mensaje del último commit
git commit --amend -m "Mejor mensaje"

# deshacer último commit, CONSERVAR el trabajo (el deseo más común)
git reset --soft HEAD~1

# deshacer un commit ya pusheado — el undo público seguro
git revert abc1234
El que salva carreras
¿Borraste un commit con reset --hard y lo quieres de vuelta? git reflog muestra cada posición en la que HEAD ha estado, incluso las "borradas". Encuentra la línea antes del desastre, luego git reset --hard HEAD@{2}. Git casi nunca borra un commit de verdad — tarda unos 30 días de abandono antes de que el garbage collection actúe. El pánico casi siempre tiene arreglo.

06Conflictos de merge: es solo un archivo de texto

Un conflicto no es un error. Es Git diciendo: "dos personas editaron las mismas líneas — no voy a adivinar." Entonces escribe ambas versiones en el archivo con marcadores y espera. Tu trabajo: abre el archivo, quédate con lo que deba sobrevivir, borra los marcadores, haz commit. Esa es toda la ceremonia.

CONFLICT (content): Merge conflict in config.py

# dentro de config.py encontrarás:
<<<<<<< HEAD
timeout = 30          # tu versión
=======
timeout = 60          # la versión de ellos
>>>>>>> feature-x

# edita con la verdad (quizás timeout = 60, quizás algo nuevo),
# BORRA las tres líneas de marcadores, luego:
git add config.py
git commit
Donde la gente se equivoca
Hacer commit de los marcadores. Si <<<<<<< aparece en tu código ejecutándose, mergeaste sin terminar de editar — y sí, la app crashea con un error de sintaxis apuntando a una línea de ángulos. También: la salida de pánico a mitad de conflicto es git merge --abort, que pone todo como estaba. Saber que existe el botón de eyección hace que todo sea menos aterrador.

07Detached HEAD: no es un error, es una excursión

Un día harás checkout de un commit viejo para ver algo, y Git imprimirá el párrafo más aterrador del software. Traducción: estás parado directamente en un commit en vez de en un post-it. Mirar alrededor es completamente seguro. El único riesgo es hacer commits nuevos aquí — no pertenecen a ninguna rama, así que es fácil perderlos.

git switch --detach abc1234    # viajar en el tiempo para inspeccionar un snapshot viejo

You are in 'detached HEAD' state. You can look around, make
experimental changes and commit them, and you can discard any
commits you make in this state without impacting any branches...

git switch -                   # terminé de mirar — volver a donde estaba

# ¿hiciste commits aquí que quieres CONSERVAR?
git switch -c rescued-work     # pegarles un post-it — salvados

08.gitignore, y el día que commiteas un secreto

Un archivo llamado .gitignore lista lo que Git debe fingir que no existe: dependencias, output de build, archivos .env con keys dentro. Escríbelo en los primeros diez minutos de cada proyecto, porque tiene una trampa: solo afecta archivos que Git no está trackeando ya.

# .gitignore
node_modules/
.env
*.log
__pycache__/

# "¡Añadí .env al .gitignore pero Git sigue trackeándolo!"
# — fue committeado antes. Deja de trackearlo (conserva el archivo local):
git rm --cached .env
git commit -m "Stop tracking .env"
El mal día
¿Pusheaste una API key a GitHub? Borrar el archivo en un commit nuevo no hace nada — la key vive en el historial, y los scrapers escanean repos públicos en minutos. El orden de operaciones: 1) revoca la key en el proveedor ahora mismo, 2) luego limpia el historial (git filter-repo) si el repo importa. Rotar la key es la solución; la cirugía del historial es solo higiene.

09Chuleta

Las líneas que todo el mundo busca en Google. Organizadas por la frase que tienes en la cabeza.

# "¿en qué estado está todo?"
git status

# "guardar mi trabajo"
git add .  &&  git commit -m "message"

# "deshacer mi último commit pero conservar el trabajo"
git reset --soft HEAD~1

# "este commit pusheado fue un error"
git revert <hash>

# "tirar mis ediciones de este archivo"
git restore <file>

# "mi push fue rechazado"
git pull   # luego push de nuevo

# "estoy en un merge infernal, eyectar"
git merge --abort

# "borré algo importante"
git reflog   # encuéntralo, luego: git reset --hard HEAD@{n}

# "guardar mi desorden, necesito un escritorio limpio 5 minutos"
git stash    # después: git stash pop

Ese es el kit de supervivencia. La verdad profunda sobre Git: casi nunca pierde tu trabajo — simplemente lo archiva en algún lugar que no has aprendido a buscar todavía. Cada mensaje aterrador de esta página tiene una salida de dos líneas. Ahora las conoces todas.