Chuleta de Git
Comandos, flags, ejemplos y errores comunes
Configuración
Lee o define opciones de configuración de Git en tres niveles: sistema, usuario (global) o repositorio (local).
git config --global user.name "John Doe" git config --global user.email "john.doe@example.com"
Define cómo Git memoriza las credenciales HTTPS para no pedir contraseña en cada push.
git config --global credential.helper manager
Define un .gitignore global aplicado a todos los repositorios.
git config --global core.excludesfile ~/.gitignore_global
Repositorios
Crea un repositorio Git nuevo en el directorio actual.
git init git init --initial-branch=main meu-projeto
Copia un repositorio remoto a la máquina local con todo el historial.
git clone https://github.com/user/repo.git
Stage y commit
Muestra el estado del working directory y del staging: qué está modificado, en stage o sin trackear.
git status
Mueve cambios del working directory al staging area, listos para el próximo commit.
git add src/components/Button.tsx git add .
Graba el contenido del staging en un commit nuevo del repositorio local con un mensaje.
git commit -m "feat: adiciona git cheat sheet"
Restaura archivos: los saca del staging o descarta cambios en el working directory.
git restore --staged file.txt git restore file.txt
Elimina archivos del repositorio (y opcionalmente del disco).
git rm secret.env
Renombra o mueve un archivo trackeado, equivalente a mv + git add + git rm.
git mv old.tsx new.tsx
Branches
Lista, crea, renombra o elimina branches.
git branch git branch feature/login
Comando antiguo para cambiar de branch o restaurar archivos. Hoy se recomienda git switch y git restore.
git checkout main git checkout -b feature/x
Versión moderna de checkout dedicada a cambiar de branch.
git switch main git switch -c feature/login
Merge y rebase
Une los cambios de otra branch en la actual, creando un commit de merge si es necesario.
git switch main git merge feature/login
Reaplica los commits de la branch actual sobre otra base, reescribiendo el historial.
git switch feature git rebase main
Aplica un commit específico de otra branch en la actual.
git cherry-pick a1b2c3d
Abre una herramienta gráfica para resolver conflictos de merge.
git mergetool --tool=meld
Remote
Gestiona los remotos del repositorio (origin, upstream, etc).
git remote -v
Descarga commits y refs del remoto sin integrarlos en la branch local.
git fetch origin
Equivale a git fetch seguido de git merge (o rebase) en la branch actual.
git pull origin main
Envía commits locales al remoto.
git push -u origin feature/login
Stash
Guarda cambios sin commitear en una pila temporal para limpiar el working directory.
git stash push -m "WIP login"
Manipulación de la pila de stashes.
git stash list git stash pop
Tags
Crea, lista, elimina o verifica tags. Las tags marcan puntos del historial (releases).
git tag -a v1.2.0 -m "Release 1.2"
Devuelve un nombre legible basado en la tag más cercana.
git describe --tags --always --dirty
Log
Muestra el historial de commits con filtros y formato flexibles.
git log --oneline --graph --decorate --all
Muestra el contenido de un commit, tag u objeto.
git show HEAD git show a1b2c3d:src/file.tsx
Muestra diferencias entre working dir, staging, commits o branches.
git diff git diff --cached git diff main feature
Muestra quién modificó cada línea de un archivo y en qué commit.
git blame -L 10,30 file.tsx
Resumen agrupado por autor (útil para release notes).
git shortlog -sne
Historial local de todo lo que HEAD tocó. Salvavidas para recuperar commits perdidos.
git reflog
git reset --hard HEAD@{2}Deshacer
Mueve HEAD a otro commit, opcionalmente alterando staging y working dir.
git reset --soft HEAD~1 git reset --mixed HEAD~1 git reset --hard HEAD~1
Crea un commit nuevo que deshace los cambios de otro. Seguro en branches compartidas.
git revert a1b2c3d
Elimina archivos sin trackear del working directory. Operación destructiva.
git clean -nfd
Submódulos
Añade un repositorio como submódulo dentro del actual.
git submodule add -b main https://github.com/user/lib.git vendor/lib
Inicializa y descarga submódulos definidos en .gitmodules.
git submodule update --init --recursive
Ver estado, ejecutar comando en cada submódulo o desactivarlo.
git submodule foreach 'git pull origin main'
Hooks
Crea un archivo ejecutable en .git/hooks/ con el nombre del evento (pre-commit, pre-push, commit-msg, post-merge, etc).
printf '#!/bin/sh\nnpm run lint\n' > .git/hooks/pre-commit chmod +x .git/hooks/pre-commit
Define un directorio de hooks compartido (versionable, fuera de .git).
git config core.hooksPath .githooks
Herramienta JS que versiona los hooks en package.json y los instala automáticamente.
npx husky init echo "npm test" > .husky/pre-commit
Salta los hooks pre-commit y commit-msg (usar con moderación).
git commit --no-verify -m "hotfix"
Avanzado
Búsqueda binaria en el historial para encontrar el commit que introdujo un bug.
git bisect start git bisect bad HEAD git bisect good v1.0 git bisect reset
Crea múltiples working directories ligadas al mismo .git, permitiendo trabajar en varias branches en paralelo.
git worktree add ../proj-hotfix hotfix/urgente
Reescribe el historial: combina, reordena, edita o elimina commits.
git rebase -i HEAD~5 # pick a1b2 feat: x # squash c3d4 fix typo # reword e5f6 chore: y # drop g7h8 wip
Reescribe el historial en masa, sustituto moderno de git filter-branch. Útil para eliminar archivos sensibles.
git filter-repo --path secrets.env --invert-paths
Crea un tarball o zip del contenido de una ref, sin .git.
git archive --format=zip --prefix=app/ -o release.zip v1.0
Empaqueta commits en un único archivo, transferible offline.
git bundle create repo.bundle --all git clone repo.bundle nova-pasta
Resuelve una referencia a un SHA completo, corto o nombre.
git rev-parse HEAD git rev-parse --abbrev-ref HEAD git rev-parse --short HEAD
Inspecciona objetos de Git (blobs, trees, commits, tags).
git cat-file -p HEAD git cat-file -t a1b2c3d
Lista archivos trackeados (ls-files) o el contenido de una tree (ls-tree).
git ls-files git ls-tree -r HEAD --name-only
Mantenimiento: garbage collection, integridad, eliminación de objetos sueltos.
git gc --aggressive --prune=now git fsck --full
Permite tener solo un subconjunto del árbol localmente, útil para monorepos grandes.
git sparse-checkout init --cone git sparse-checkout set apps/web libs/ui
Añade notas a commits sin alterar su SHA.
git notes add -m "reviewed by QA" HEAD
Referencia
┌──────────────┐ git add ┌────────────┐ git commit ┌─────────────┐ git push ┌──────────┐
│ Working Dir │ ───────────▶ │ Staging │ ───────────▶ │ Local Repo │ ──────────▶ │ Remote │
│ (files) │ ◀─────────── │ (index) │ ◀─────────── │ (.git) │ ◀────────── │ (origin) │
└──────────────┘ git restore └────────────┘ git reset └─────────────┘ git fetch └──────────┘
git pull = git fetch + git merge- untrackedarchivo nuevo, Git aún no lo conoce
- modifiedarchivo conocido fue modificado
- stagedmarcado para el próximo commit
- committedguardado en .git, parte de la historia
- ignoredincluido en .gitignore
Branches compartidas, integrar features grandes preservando contexto, branches de release.
- No reescribe el historial
- Seguro en cualquier escenario
- Preserva la timeline real
- Historial con diamantes y ruido
- git log más difícil de leer
Actualizar feature branch local con main antes del PR. Mantener historial lineal.
- Historial lineal y limpio
- git log legible
- git bisect más eficaz
- Reescribe SHAs (NUNCA en branches públicas)
- Los conflictos pueden ser repetitivos
- Pierde contexto temporal
Antes de mergear una feature con varios commits 'wip' o 'fix typo' en main.
- 1 commit limpio por feature
- main con historial ultra-legible
- Pierde granularidad del desarrollo
- git bisect solo localiza la feature entera
Regla de oro: rebase localmente, merge públicamente. Nunca hacer rebase en branches que otros usan.
--softMantiene staging y working dirMueve HEAD. Mantiene staging y working dir intactos. Los archivos quedan en staging.
Reagrupar commits sin perder cambios.
--mixedLimpia staging, mantiene working dir(default) Mueve HEAD. Limpia staging pero mantiene working dir. Los archivos quedan unstaged.
Rehacer lo que iba al próximo commit.
--hardBorra todo (destructivo)Mueve HEAD. Limpia staging Y working dir. Borra cambios sin commitear. Destructivo.
Volver al estado de otro commit, abandonándolo todo.
fatal: refusing to merge unrelated historiesLos dos repos no comparten un commit ancestro común.
git pull origin main --allow-unrelated-histories
Updates were rejected because the remote contains work that you do not haveEl remoto tiene commits que el local desconoce.
git pull --rebase origin main y luego git push. Nunca hagas push --force sin --force-with-lease.
Please commit your changes or stash them before you switch branchesHay cambios locales que entrarían en conflicto al cambiar de branch.
git stash, git switch otra-branch y luego git stash pop.
CONFLICT (content): Merge conflict in <file>El merge o rebase tocó las mismas líneas que otra branch.
Editar entre <<<<<<< ======= >>>>>>> y luego git add archivo seguido de git merge --continue. Para abortar: git merge --abort.
detached HEADSe hizo checkout de un SHA o tag en vez de una branch.
Para guardar el trabajo usa git switch -c nueva-branch. Para descartar usa git switch main.
Permission denied (publickey)Clave SSH no configurada en GitHub o GitLab.
Ejecuta ssh-keygen -t ed25519 -C "email" y añade ~/.ssh/id_ed25519.pub a las claves SSH del servicio.
fatal: Authentication failed (HTTPS)GitHub dejó de aceptar contraseña, hace falta un Personal Access Token.
Generar un PAT en GitHub y usarlo como contraseña, o cambiar el remote a SSH.
Your branch and 'origin/main' have divergedAmbos lados tienen commits diferentes.
git pull --rebase en feature local, o git pull simple en main compartida.
error: failed to push some refs (non-fast-forward)El remoto avanzó, no se puede empujar sin integrar primero.
git pull --rebase seguido de git push.
Borré la branch equivocada o hice reset --hard y perdí trabajoOperación destructiva sin backup.
git reflog para encontrar el SHA, luego git checkout -b recuperada <sha>. Los commits permanecen ~30 días antes del gc.
.gitignore no funcionaEl archivo ya estaba trackeado antes de ser ignorado.
git rm --cached <archivo> seguido de git commit -m "untrack". Para directorios: git rm -r --cached <carpeta>.
Hice commit de un secreto, contraseña o archivo .envgit add . sin cuidado.
Rotar el secreto, ejecutar git filter-repo --path .env --invert-paths, git push --force-with-lease y avisar al equipo para reclonar.
LF will be replaced by CRLFDiferencias de fin de línea entre Windows y Unix.
git config --global core.autocrlf true en Windows, o input en Mac y Linux.
Filename too long (Windows)Límite de 260 caracteres de Windows.
git config --system core.longpaths true