Git es una de esas herramientas donde puedes arreglártelas con unos 15 comandos durante años — y entonces un día accidentalmente haces rebase de tu rama main y de repente deseas haber aprendido algunos más. Este cheatsheet es esos "algunos más" sin el ataque de pánico.
Esto es algo que nadie te dice al principio: git es realmente solo un grafo acíclico dirigido de snapshots. Cada commit es un snapshot, cada branch es un puntero, y HEAD es solo una nota adhesiva que dice "estás aquí." Una vez que eso hace clic, todo lo demás — rebase, cherry-pick, reset — deja de sentirse como magia negra y empieza a sentirse como mover notas adhesivas.
Hemos organizado esto por flujo de trabajo en lugar de alfabéticamente, porque nadie piensa "necesito un comando que empiece con R." Piensas "necesito deshacer ese último commit" o "necesito traer la rama de mi compañero." Empieza con Flujo de Trabajo Básico si estás comenzando, luego ramifícate (el juego de palabras es totalmente intencional) a medida que te sientas cómodo. Las secciones de Stash y Reset te salvarán el pellejo al menos una vez por semana.
Una regla de oro: haz commit temprano, haz commit frecuentemente. Los commits pequeños son fáciles de revisar, fáciles de revertir y fáciles de entender seis meses después cuando estés leyendo git log y preguntándote qué estaba pensando tu yo del pasado.
Flujo de Trabajo Básico
git init
Crear un nuevo repositorio en el directorio actualgit clone <url>
Descargar un repositorio y todo su historialgit status
Mostrar archivos modificados, preparados y sin seguimientogit add <file>
Preparar un archivo específico para el próximo commitgit add .
Preparar todos los cambios en el directorio actualgit commit -m "<msg>"
Hacer commit de los cambios preparados con un mensajegit push
Subir commits locales al remotogit pull
Descargar y fusionar cambios remotos en tu rama
Branching
git branch
Listar todas las ramas localesgit branch -a
Listar ramas locales y remotasgit branch <name>
Crear una nueva rama (pero quedarse en la actual)git switch <name>
Cambiar a una rama existentegit switch -c <name>
Crear una nueva rama y cambiar a ellagit branch -d <name>
Eliminar una rama (seguro — bloquea si no está fusionada)git branch -D <name>
Forzar eliminación de una rama, incluso si no está fusionadagit branch -m <new>
Renombrar la rama actual
Merge y Rebase
git merge <branch>
Fusionar una rama en tu rama actualgit merge --no-ff <branch>
Fusionar con un commit de merge, incluso si fast-forward es posiblegit rebase <branch>
Replicar tus commits sobre otra ramagit rebase --abort
Cancelar un rebase en progreso y restaurar el estado originalgit rebase --continue
Continuar el rebase después de resolver conflictosgit merge --abort
Cancelar un merge en progresogit cherry-pick <hash>
Aplicar un commit individual de otra rama
Stash
git stash
Guardar temporalmente todos los cambios sin commitgit stash -u
Guardar en stash incluyendo archivos sin seguimientogit stash pop
Restaurar el stash más reciente y eliminarlogit stash apply
Restaurar el stash más reciente pero mantenerlo en la listagit stash list
Mostrar todos los conjuntos de cambios guardados en stashgit stash drop
Eliminar el stash más recientegit stash drop stash@{n}
Eliminar un stash específico por índice
Log y Diff
git log
Mostrar historial de commits de la rama actualgit log --oneline
Historial compacto de una línea por commitgit log --graph --oneline
Mostrar historial de ramas como un gráfico ASCIIgit diff
Mostrar cambios no preparados vs último commitgit diff --staged
Mostrar cambios preparados vs último commitgit diff <branch1> <branch2>
Comparar dos ramasgit show <hash>
Mostrar los cambios de un commit específicogit log -p <file>
Mostrar el historial completo de cambios de un archivo
Reset y Revert
git reset <file>
Quitar un archivo del staging pero mantener los cambiosgit reset HEAD~1
Deshacer el último commit, mantener cambios en staginggit reset --soft HEAD~1
Deshacer el último commit, mantener cambios en staging (explícito)git reset --hard HEAD~1
Deshacer el último commit y descartar todos los cambios permanentementegit revert <hash>
Crear un nuevo commit que deshace un commit anteriorgit checkout -- <file>
Descartar cambios no preparados de un archivo específicogit restore <file>
Descartar cambios no preparados (sintaxis moderna)git restore --staged <file>
Quitar un archivo del staging (sintaxis moderna)
Remotos
git remote -v
Listar todos los remotos con sus URLsgit remote add <name> <url>
Agregar un nuevo repositorio remotogit fetch
Descargar cambios remotos sin fusionargit fetch --prune
Descargar y eliminar ramas de seguimiento remoto obsoletasgit pull --rebase
Descargar cambios remotos y hacer rebase de tu trabajo encimagit push -u origin <branch>
Subir una rama y configurarla para rastrear el remotogit push origin --delete <branch>
Eliminar una rama remota
Tags
git tag
Listar todos los tagsgit tag <name>
Crear un tag ligero en el commit actualgit tag -a <name> -m "<msg>"
Crear un tag anotado con un mensajegit push --tags
Subir todos los tags locales al remotogit tag -d <name>
Eliminar un tag localgit push origin --delete <tag>
Eliminar un tag remoto
Usa git switch y git restore en lugar de git checkout. El comando checkout hace demasiadas cosas — switch maneja ramas, restore maneja archivos. Intención más clara, menos errores.
Ejecuta git pull --rebase en lugar de un simple git pull para mantener tu historial lineal. Mejor aún, configúralo como predeterminado: git config --global pull.rebase true.
¿Cometiste un error tipográfico en tu último mensaje de commit? git commit --amend -m "mensaje corregido" lo reescribe. Solo no hagas amend de commits que ya hayas subido — eso reescribe historial del que tus compañeros podrían depender.
Usa git stash -u en lugar de un simple git stash. La flag -u incluye archivos sin seguimiento, que es casi siempre lo que quieres. Sin ella, los archivos nuevos que no hayas añadido se quedan atrás.
El git reflog es tu máquina del tiempo. Incluso después de un mal reset --hard, tus commits no desaparecen realmente durante unos 30 días. Ejecuta git reflog, encuentra el hash que quieres, y git reset --hard <hash> para recuperarlo.
Antes de un merge o rebase grande, crea una "rama de seguridad" con git branch backup-antes-del-merge. Si todo sale mal, siempre puedes volver a donde empezaste. Un seguro barato.
Usa git log --oneline --graph --all para visualizar toda la topología de ramas en el terminal. Es la forma más rápida de entender qué está pasando en un repo con múltiples ramas activas.