MaisTools
Desarrollador/

Chuleta de Git

Referencia rápida de Git: comandos, flags, ejemplos y variaciones organizados por sección con búsqueda instantánea.

Chuleta de Git

Comandos, flags, ejemplos y errores comunes

Configuración

git config

Lee o define opciones de configuración de Git en tres niveles: sistema, usuario (global) o repositorio (local).

Flags--global--local--system--list--unset--edit
Ejemplo
git config --global user.name "John Doe"
git config --global user.email "john.doe@example.com"
git config credential.helper

Define cómo Git memoriza las credenciales HTTPS para no pedir contraseña en cada push.

Ejemplo
git config --global credential.helper manager
git config --global core.excludesfile

Define un .gitignore global aplicado a todos los repositorios.

Ejemplo
git config --global core.excludesfile ~/.gitignore_global

Repositorios

git init

Crea un repositorio Git nuevo en el directorio actual.

Flags--bare--initial-branch=--shared
Ejemplo
git init
git init --initial-branch=main meu-projeto
git clone

Copia un repositorio remoto a la máquina local con todo el historial.

Flags--depth--branch--single-branch--recurse-submodules--mirror--bare
Ejemplo
git clone https://github.com/user/repo.git

Stage y commit

git status

Muestra el estado del working directory y del staging: qué está modificado, en stage o sin trackear.

Flags-s-b--ignored-uno
Ejemplo
git status
git add

Mueve cambios del working directory al staging area, listos para el próximo commit.

Flags-A-p-i-u-n-f
Ejemplo
git add src/components/Button.tsx
git add .
git commit

Graba el contenido del staging en un commit nuevo del repositorio local con un mensaje.

Flags-m-a--amend--no-edit-S--allow-empty--no-verify--fixup--squash
Ejemplo
git commit -m "feat: adiciona git cheat sheet"
git restore

Restaura archivos: los saca del staging o descarta cambios en el working directory.

Flags--staged--source=--worktree
Ejemplo
git restore --staged file.txt
git restore file.txt
git rm

Elimina archivos del repositorio (y opcionalmente del disco).

Flags--cached-r-f-n
Ejemplo
git rm secret.env
git mv

Renombra o mueve un archivo trackeado, equivalente a mv + git add + git rm.

Flags-f-n
Ejemplo
git mv old.tsx new.tsx

Branches

git branch

Lista, crea, renombra o elimina branches.

Flags-a-r-vv-d-D-m-M--merged--no-merged--contains
Ejemplo
git branch
git branch feature/login
git checkout

Comando antiguo para cambiar de branch o restaurar archivos. Hoy se recomienda git switch y git restore.

Flags-b-B--orphan--detach
Ejemplo
git checkout main
git checkout -b feature/x
git switch

Versión moderna de checkout dedicada a cambiar de branch.

Flags-c-C--detach--discard-changes
Ejemplo
git switch main
git switch -c feature/login

Merge y rebase

git merge

Une los cambios de otra branch en la actual, creando un commit de merge si es necesario.

Flags--no-ff--ff-only--squash--abort--continue-X-s
Ejemplo
git switch main
git merge feature/login
git rebase

Reaplica los commits de la branch actual sobre otra base, reescribiendo el historial.

Flags-i--onto--continue--abort--skip--autosquash--autostash
Ejemplo
git switch feature
git rebase main
git cherry-pick

Aplica un commit específico de otra branch en la actual.

Flags-x-n--continue--abort
Ejemplo
git cherry-pick a1b2c3d
git mergetool

Abre una herramienta gráfica para resolver conflictos de merge.

Flags--tool=-y
Ejemplo
git mergetool --tool=meld

Remote

git remote

Gestiona los remotos del repositorio (origin, upstream, etc).

Subcomandosaddremoverenameset-urlshowprune
Flags-v
Ejemplo
git remote -v
git fetch

Descarga commits y refs del remoto sin integrarlos en la branch local.

Flags--all--prune--tags--depth--unshallow
Ejemplo
git fetch origin
git pull

Equivale a git fetch seguido de git merge (o rebase) en la branch actual.

Flags--rebase--ff-only--no-rebase--autostash
Ejemplo
git pull origin main
git push

Envía commits locales al remoto.

Flags-u--force--force-with-lease--tags--delete--dry-run--all
Ejemplo
git push -u origin feature/login

Stash

git stash

Guarda cambios sin commitear en una pila temporal para limpiar el working directory.

Subcomandospush
Flags-u-a-m-k-p
Ejemplo
git stash push -m "WIP login"
git stash list / show / pop / apply / drop / clear

Manipulación de la pila de stashes.

Ejemplo
git stash list
git stash pop

Tags

git tag

Crea, lista, elimina o verifica tags. Las tags marcan puntos del historial (releases).

Flags-a-m-s-d-l-f
Ejemplo
git tag -a v1.2.0 -m "Release 1.2"
git describe

Devuelve un nombre legible basado en la tag más cercana.

Flags--tags--always--dirty--abbrev
Ejemplo
git describe --tags --always --dirty

Log

git log

Muestra el historial de commits con filtros y formato flexibles.

Flags--oneline--graph--all--decorate-p--stat--since--author--grep-S
Ejemplo
git log --oneline --graph --decorate --all
git show

Muestra el contenido de un commit, tag u objeto.

Flags--stat--name-only--name-status
Ejemplo
git show HEAD
git show a1b2c3d:src/file.tsx
git diff

Muestra diferencias entre working dir, staging, commits o branches.

Flags--cached--staged--stat--name-only--word-diff
Ejemplo
git diff
git diff --cached
git diff main feature
git blame

Muestra quién modificó cada línea de un archivo y en qué commit.

Flags-L-w-C-M
Ejemplo
git blame -L 10,30 file.tsx
git shortlog

Resumen agrupado por autor (útil para release notes).

Flags-s-n-e
Ejemplo
git shortlog -sne
git reflog

Historial local de todo lo que HEAD tocó. Salvavidas para recuperar commits perdidos.

Subcomandosshowexpiredelete
Ejemplo
git reflog
git reset --hard HEAD@{2}

Deshacer

git reset

Mueve HEAD a otro commit, opcionalmente alterando staging y working dir.

Flags--soft--mixed--hard--keep--merge
Ejemplo
git reset --soft HEAD~1
git reset --mixed HEAD~1
git reset --hard HEAD~1
git revert

Crea un commit nuevo que deshace los cambios de otro. Seguro en branches compartidas.

Flags--no-commit-m--continue--abort
Ejemplo
git revert a1b2c3d
git clean

Elimina archivos sin trackear del working directory. Operación destructiva.

Flags-n-f-d-x-X-i
Ejemplo
git clean -nfd

Submódulos

git submodule add

Añade un repositorio como submódulo dentro del actual.

Flags-b--name
Ejemplo
git submodule add -b main https://github.com/user/lib.git vendor/lib
git submodule init / update

Inicializa y descarga submódulos definidos en .gitmodules.

Flags--init--recursive--remote--merge--rebase
Ejemplo
git submodule update --init --recursive
git submodule status / foreach / deinit

Ver estado, ejecutar comando en cada submódulo o desactivarlo.

Flags--recursive
Ejemplo
git submodule foreach 'git pull origin main'

Hooks

Activar un hook manual

Crea un archivo ejecutable en .git/hooks/ con el nombre del evento (pre-commit, pre-push, commit-msg, post-merge, etc).

Ejemplo
printf '#!/bin/sh\nnpm run lint\n' > .git/hooks/pre-commit
chmod +x .git/hooks/pre-commit
git config core.hooksPath

Define un directorio de hooks compartido (versionable, fuera de .git).

Ejemplo
git config core.hooksPath .githooks
Husky

Herramienta JS que versiona los hooks en package.json y los instala automáticamente.

Ejemplo
npx husky init
echo "npm test" > .husky/pre-commit
git commit --no-verify

Salta los hooks pre-commit y commit-msg (usar con moderación).

Ejemplo
git commit --no-verify -m "hotfix"

Avanzado

git bisect

Búsqueda binaria en el historial para encontrar el commit que introdujo un bug.

Subcomandosstartgoodbadskipresetrun
Ejemplo
git bisect start
git bisect bad HEAD
git bisect good v1.0
git bisect reset
git worktree

Crea múltiples working directories ligadas al mismo .git, permitiendo trabajar en varias branches en paralelo.

Subcomandosaddlistremoveprune
Ejemplo
git worktree add ../proj-hotfix hotfix/urgente
git rebase -i

Reescribe el historial: combina, reordena, edita o elimina commits.

Subcomandospickrewordeditsquashfixupdropexec
Ejemplo
git rebase -i HEAD~5
# pick    a1b2 feat: x
# squash  c3d4 fix typo
# reword  e5f6 chore: y
# drop    g7h8 wip
git filter-repo

Reescribe el historial en masa, sustituto moderno de git filter-branch. Útil para eliminar archivos sensibles.

Flags--path--invert-paths--replace-text
Ejemplo
git filter-repo --path secrets.env --invert-paths
git archive

Crea un tarball o zip del contenido de una ref, sin .git.

Flags--format--prefix-o
Ejemplo
git archive --format=zip --prefix=app/ -o release.zip v1.0
git bundle

Empaqueta commits en un único archivo, transferible offline.

Subcomandoscreateverifyunbundle
Ejemplo
git bundle create repo.bundle --all
git clone repo.bundle nova-pasta
git rev-parse

Resuelve una referencia a un SHA completo, corto o nombre.

Flags--short--abbrev-ref--verify
Ejemplo
git rev-parse HEAD
git rev-parse --abbrev-ref HEAD
git rev-parse --short HEAD
git cat-file

Inspecciona objetos de Git (blobs, trees, commits, tags).

Flags-p-t-s
Ejemplo
git cat-file -p HEAD
git cat-file -t a1b2c3d
git ls-files / ls-tree

Lista archivos trackeados (ls-files) o el contenido de una tree (ls-tree).

Flags--cached--others--ignored
Ejemplo
git ls-files
git ls-tree -r HEAD --name-only
git gc / fsck

Mantenimiento: garbage collection, integridad, eliminación de objetos sueltos.

Flags--aggressive--prune=now
Ejemplo
git gc --aggressive --prune=now
git fsck --full
git sparse-checkout

Permite tener solo un subconjunto del árbol localmente, útil para monorepos grandes.

Subcomandosinitsetlistdisable
Ejemplo
git sparse-checkout init --cone
git sparse-checkout set apps/web libs/ui
git notes

Añade notas a commits sin alterar su SHA.

Subcomandosaddshoweditremove
Ejemplo
git notes add -m "reviewed by QA" HEAD

Referencia

Flujo de Git
┌──────────────┐  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
Merge vs Rebase vs Squash
Merge

Branches compartidas, integrar features grandes preservando contexto, branches de release.

Ventajas
  • No reescribe el historial
  • Seguro en cualquier escenario
  • Preserva la timeline real
Desventajas
  • Historial con diamantes y ruido
  • git log más difícil de leer
Rebase

Actualizar feature branch local con main antes del PR. Mantener historial lineal.

Ventajas
  • Historial lineal y limpio
  • git log legible
  • git bisect más eficaz
Desventajas
  • Reescribe SHAs (NUNCA en branches públicas)
  • Los conflictos pueden ser repetitivos
  • Pierde contexto temporal
Squash

Antes de mergear una feature con varios commits 'wip' o 'fix typo' en main.

Ventajas
  • 1 commit limpio por feature
  • main con historial ultra-legible
Desventajas
  • 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.

Reset: soft, mixed, hard
--softMantiene staging y working dir

Mueve 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.

Errores comunes y soluciones
fatal: refusing to merge unrelated histories
Causa

Los dos repos no comparten un commit ancestro común.

Solución

git pull origin main --allow-unrelated-histories

Updates were rejected because the remote contains work that you do not have
Causa

El remoto tiene commits que el local desconoce.

Solución

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 branches
Causa

Hay cambios locales que entrarían en conflicto al cambiar de branch.

Solución

git stash, git switch otra-branch y luego git stash pop.

CONFLICT (content): Merge conflict in <file>
Causa

El merge o rebase tocó las mismas líneas que otra branch.

Solución

Editar entre <<<<<<< ======= >>>>>>> y luego git add archivo seguido de git merge --continue. Para abortar: git merge --abort.

detached HEAD
Causa

Se hizo checkout de un SHA o tag en vez de una branch.

Solución

Para guardar el trabajo usa git switch -c nueva-branch. Para descartar usa git switch main.

Permission denied (publickey)
Causa

Clave SSH no configurada en GitHub o GitLab.

Solución

Ejecuta ssh-keygen -t ed25519 -C "email" y añade ~/.ssh/id_ed25519.pub a las claves SSH del servicio.

fatal: Authentication failed (HTTPS)
Causa

GitHub dejó de aceptar contraseña, hace falta un Personal Access Token.

Solución

Generar un PAT en GitHub y usarlo como contraseña, o cambiar el remote a SSH.

Your branch and 'origin/main' have diverged
Causa

Ambos lados tienen commits diferentes.

Solución

git pull --rebase en feature local, o git pull simple en main compartida.

error: failed to push some refs (non-fast-forward)
Causa

El remoto avanzó, no se puede empujar sin integrar primero.

Solución

git pull --rebase seguido de git push.

Borré la branch equivocada o hice reset --hard y perdí trabajo
Causa

Operación destructiva sin backup.

Solución

git reflog para encontrar el SHA, luego git checkout -b recuperada <sha>. Los commits permanecen ~30 días antes del gc.

.gitignore no funciona
Causa

El archivo ya estaba trackeado antes de ser ignorado.

Solución

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 .env
Causa

git add . sin cuidado.

Solución

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 CRLF
Causa

Diferencias de fin de línea entre Windows y Unix.

Solución

git config --global core.autocrlf true en Windows, o input en Mac y Linux.

Filename too long (Windows)
Causa

Límite de 260 caracteres de Windows.

Solución

git config --system core.longpaths true