Comandos de Git: chuleta con ejemplos para el día a día
Los comandos principales de Git son git init y git clone para crear un repositorio; git status, git add y git commit para guardar cambios; git branch, git switch y git merge para trabajar con ramas; git push, git fetch y git pull para sincronizar con el servidor; y git restore, git reset y git revert para deshacer cambios.
Aquí tienes una chuleta de Git para el trabajo diario: los comandos están agrupados por tareas y cada uno tiene un ejemplo y una breve explicación. Conviene tenerla abierta junto al terminal: casi todo lo que un desarrollador hace con Git en un día cabe en los 20–30 comandos de estas tablas.
Para que los comandos tengan sentido, ten presentes tres áreas: el directorio de trabajo (los archivos en disco), el índice o staging area (lo que entrará en el próximo commit) y el repositorio (el historial de commits en la carpeta .git). La mayoría de los comandos de Git mueven cambios entre estas tres zonas o entre el repositorio local y el remoto.
Configuración de Git
Estos comandos se ejecutan una vez tras la instalación. La opción --global guarda los ajustes en ~/.gitconfig y se aplica a todos los repositorios del usuario; sin ella, solo al repositorio actual.
| Comando | Qué hace |
|---|---|
git config --global user.name "Ana García" | Nombre del autor de los commits |
git config --global user.email "ana@example.com" | Correo del autor de los commits |
git config --global init.defaultBranch main | Nombre de la rama por defecto en los repositorios nuevos |
git config --global core.editor "code --wait" | Editor para los mensajes de commit (aquí, VS Code) |
git config --global pull.rebase false | Comportamiento por defecto de git pull: fusión |
git config --global core.autocrlf input | Convertir CRLF en LF al hacer commit (macOS/Linux; en Windows normalmente true) |
git config --list --show-origin | Mostrar todos los ajustes y el archivo del que sale cada uno |
git config --global alias.st status | Alias: git st en lugar de git status |
git --version | Versión de Git instalada |
git help commit | Ayuda completa de un comando (o git commit -h, la breve) |
Crear y clonar un repositorio
| Comando | Qué hace |
|---|---|
git init | Crea un repositorio vacío (la carpeta .git) en el directorio actual |
git init my-project | Crea el directorio my-project y un repositorio dentro |
git clone https://github.com/user/repo.git | Copia un repositorio remoto con todo su historial |
git clone git@github.com:user/repo.git app | Clona por SSH en la carpeta app |
git clone --depth 1 URL | Clon superficial: solo el último commit, rápido y ocupa poco |
git clone -b develop URL | Clona y cambia directamente a la rama develop |
El ciclo básico: status, add, commit
Es el núcleo del trabajo diario: ver qué ha cambiado, llevar al índice lo necesario y fijarlo con un commit.
| Comando | Qué hace |
|---|---|
git status | Estado: archivos modificados, en el índice y sin seguimiento |
git status -s | Formato breve: M, modificado; A, añadido; ??, sin seguimiento |
git add file.txt | Añadir un archivo al índice |
git add . | Añadir todos los cambios del directorio actual y subdirectorios, incluidos los borrados |
git add -A | Añadir todos los cambios de todo el repositorio |
git add -p | Elegir de forma interactiva fragmentos concretos (hunks) de los cambios |
git commit -m "Añadir formulario de acceso" | Crear un commit a partir del índice con un mensaje |
git commit -am "Corregir errata" | Añadir al índice todos los archivos con seguimiento modificados y hacer commit; los archivos nuevos no entran |
git commit --amend | Reescribir el último commit: añadir lo olvidado del índice o corregir el mensaje |
git commit --amend --no-edit | Completar el último commit sin cambiar el mensaje |
git rm file.txt | Borrar un archivo del disco y del índice |
git rm --cached secret.env | Dejar de seguir un archivo pero conservarlo en disco |
git mv old.js new.js | Renombrar o mover un archivo |
Un escenario típico es este:
git status
git add src/login.js src/login.css
git diff --staged # comprobar qué va a entrar exactamente en el commit
git commit -m "Añadir formulario de acceso"
No uses --amend con commits que ya se han subido a una rama compartida: crea un commit nuevo con otro hash y tus compañeros tendrán que lidiar con un historial divergente.
Ver el historial y los cambios
| Comando | Qué hace |
|---|---|
git log | Historial de commits de la rama actual |
git log --oneline | Cada commit en una línea: hash corto y título |
git log --oneline --graph --all | Grafo de todas las ramas en el terminal |
git log -p file.txt | Historial de un archivo con el diff de cada commit |
git log --author="Ana" --since="2 weeks ago" | Filtrar por autor y fecha |
git log -S "getUser" | Commits en los que se añadió o eliminó la cadena getUser |
git log main..feature | Commits que están en feature pero no en main |
git diff | Cambios en el directorio de trabajo aún no añadidos al índice |
git diff --staged | Cambios del índice respecto al último commit (sinónimo de --cached) |
git diff main feature | Diferencia entre las puntas de dos ramas |
git diff HEAD~3 -- src/ | Cambios en la carpeta src en los tres últimos commits |
git show a1b2c3d | Metadatos y diff de un commit concreto |
git show HEAD:README.md | Contenido de un archivo en el último commit |
git blame app.js | Quién modificó por última vez cada línea y en qué commit |
git shortlog -sn | Número de commits por autor |
Las referencias a commits sirven en todas partes: HEAD es el commit actual, HEAD~1 su padre, HEAD~3 tres pasos atrás por el primer padre y HEAD^2 el segundo padre de un commit de merge.
Ramas: crear, cambiar y borrar
Desde la versión 2.23, Git tiene git switch para las ramas y git restore para los archivos: se repartieron las funciones del sobrecargado git checkout. Las formas antiguas siguen funcionando.
| Comando | Qué hace |
|---|---|
git branch | Lista de ramas locales; la actual va marcada con * |
git branch -a | Ramas locales y remotas (remote-tracking) |
git branch -vv | Ramas con su último commit y cuánto van por detrás o por delante del upstream |
git branch feature/login | Crear una rama sin cambiar a ella |
git switch feature/login | Cambiar a una rama |
git switch -c feature/login | Crear una rama y cambiar a ella (equivale a git checkout -b) |
git switch - | Volver a la rama anterior |
git branch -m new-name | Renombrar la rama actual |
git branch -d feature/login | Borrar una rama si ya está fusionada |
git branch -D feature/login | Borrar una rama a la fuerza, aunque no esté fusionada |
git branch --merged | Ramas ya integradas en la actual: candidatas a borrarse |
Fusión y rebase
| Comando | Qué hace |
|---|---|
git merge feature | Integrar feature en la rama actual (fast-forward si es posible) |
git merge --no-ff feature | Crear siempre un commit de merge |
git merge --squash feature | Reunir todos los cambios de la rama en el índice como un solo bloque; después, git commit |
git merge --abort | Cancelar una fusión con conflictos y volver al estado inicial |
git rebase main | Trasladar los commits de la rama actual encima de main |
git rebase -i HEAD~4 | Modo interactivo: combinar (squash), renombrar, reordenar o eliminar los 4 últimos commits |
git rebase --continue | Continuar tras resolver un conflicto |
git rebase --abort | Cancelar el rebase por completo |
git cherry-pick a1b2c3d | Aplicar un commit a la rama actual como commit nuevo |
Resolver un conflicto de fusión casi siempre se ve igual:
git merge feature
# CONFLICT (content): Merge conflict in app.js
git status # archivos en la sección "both modified"
# editamos app.js y quitamos los marcadores <<<<<<< ======= >>>>>>>
git add app.js
git commit # Git propondrá un mensaje listo para el commit de merge
La regla principal de rebase: no hagas rebase de commits que ya están en una rama compartida y sobre los que otros construyen su trabajo.
Trabajar con repositorios remotos
| Comando | Qué hace |
|---|---|
git remote -v | Lista de remotos y sus direcciones |
git remote add origin git@github.com:user/repo.git | Conectar un repositorio remoto con el nombre origin |
git remote set-url origin NEW_URL | Cambiar la dirección del remoto (por ejemplo, de HTTPS a SSH) |
git remote remove upstream | Desconectar un remoto |
git fetch | Descargar commits y ramas nuevos sin tocar tus archivos |
git fetch --prune | Lo mismo, y además borrar las referencias a ramas eliminadas en el servidor |
git pull | git fetch + fusión de la rama upstream en la actual |
git pull --rebase | git fetch + rebase de tus commits encima de los recibidos |
git push | Enviar los commits de la rama actual a su upstream |
git push -u origin feature/login | Primer envío de una rama, configurando el upstream |
git push --force-with-lease | Sobrescribir la rama remota solo si no tiene commits nuevos de otros |
git push origin --delete feature/login | Borrar una rama en el servidor |
git push --tags | Enviar todas las etiquetas locales |
En lugar de git push --force, acostúmbrate a --force-with-lease: si un compañero ya subió algo a esa misma rama, el comando se negará a sobrescribir su trabajo.
Deshacer cambios
La parte más estresante de Git. La pregunta clave antes de elegir el comando: ¿los cambios están solo en los archivos, ya en el índice, en un commit local o en un commit publicado?
| Situación | Comando |
|---|---|
| Descartar los cambios de un archivo (dejarlo como en el último commit) | git restore app.js |
| Sacar un archivo del índice conservando los cambios | git restore --staged app.js |
| Recuperar un archivo de un commit concreto | git restore --source=a1b2c3d app.js |
| Deshacer el último commit dejando los cambios en el índice | git reset --soft HEAD~1 |
| Deshacer el último commit dejando los cambios en los archivos | git reset HEAD~1 (modo --mixed por defecto) |
| Eliminar el último commit y todos sus cambios | git reset --hard HEAD~1 |
| Deshacer un commit publicado con un commit «inverso» nuevo | git revert a1b2c3d |
| Deshacer un commit de merge | git revert -m 1 <merge-hash> |
| Ver qué archivos sin seguimiento se borrarían | git clean -n |
| Borrar archivos y carpetas sin seguimiento | git clean -fd |
| Encontrar un commit «perdido» tras un reset o rebase | git reflog y después git reset --hard HEAD@{2} |
git reset --hard y git clean -f eliminan sin vuelta atrás los cambios sin commit: el reflog solo guarda commits, no los cambios del directorio de trabajo. Antes de usarlos, haz git stash o al menos git status.
Stash: apartar el trabajo a medias
| Comando | Qué hace |
|---|---|
git stash | Guardar los cambios de los archivos con seguimiento y limpiar el directorio de trabajo |
git stash push -u -m "wip: formulario" | Guardar también los archivos sin seguimiento, con una descripción |
git stash list | Lista de bloques guardados: stash@{0}, stash@{1}… |
git stash show -p stash@{0} | Ver el diff de un bloque guardado |
git stash pop | Recuperar el último bloque y quitarlo de la lista |
git stash apply stash@{1} | Recuperar un bloque dejándolo en la lista |
git stash drop stash@{1} | Borrar un bloque |
git stash branch fix-form | Crear una rama desde el commit donde se hizo el stash y aplicarlo |
Etiquetas y releases
| Comando | Qué hace |
|---|---|
git tag | Lista de etiquetas |
git tag -a v1.2.0 -m "Release 1.2.0" | Etiqueta anotada con autor, fecha y mensaje |
git tag v1.2.0 a1b2c3d | Etiqueta ligera sobre un commit concreto |
git push origin v1.2.0 | Enviar una etiqueta |
git tag -d v1.2.0 | Borrar una etiqueta en local |
git push origin --delete v1.2.0 | Borrar una etiqueta en el servidor |
git describe --tags | La etiqueta más cercana y el número de commits tras ella, por ejemplo v1.2.0-3-ga1b2c3d |
Comandos avanzados de Git
| Comando | Qué hace |
|---|---|
git bisect start, git bisect bad, git bisect good v1.1.0 | Búsqueda binaria del commit que introdujo un error; al final, git bisect reset |
git worktree add ../hotfix main | Una segunda carpeta de trabajo con otra rama del mismo repositorio |
git submodule update --init --recursive | Descargar los submódulos tras clonar |
git grep "TODO" | Búsqueda rápida en los archivos con seguimiento |
git format-patch -1 HEAD / git apply fix.patch | Guardar un commit como parche y aplicar un parche al directorio de trabajo |
git gc | Empaquetar objetos y limpiar el repositorio (normalmente Git lo hace solo) |
Errores frecuentes y cómo arreglarlos
Hiciste commit en main en lugar de en una rama nueva
Si el commit aún no se ha subido, crea una rama en el commit actual y haz retroceder main:
git branch feature/login # la rama apunta a tu commit
git reset --hard HEAD~1 # main retrocede un paso
git switch feature/login
Olvidaste añadir un archivo al último commit
git add forgotten.js
git commit --amend --no-edit
Push rechazado: rejected, non-fast-forward
En el servidor hay commits que tú no tienes. Primero tráelos y después envía:
git pull --rebase
git push
Subiste por error un archivo con contraseñas
Deja de seguirlo y añádelo a .gitignore: git rm --cached .env y después un commit. Si el commit ya está publicado, considera el secreto comprometido y regéneralo: sigue estando en el historial.
Conclusión
Para el trabajo diario basta con un conjunto reducido: status, add, commit, switch, merge, pull, push y log --oneline. Elige los comandos para deshacer (restore, reset, revert) según si el commit está publicado o no, y recuerda reflog como red de seguridad para casos extremos. Todos los comandos de Git de esta chuleta se practican en el curso de Git, donde pruebas cada uno en tu propio repositorio.
Preguntas frecuentes
¿Cuántos comandos de Git necesita conocer un principiante?
Para empezar bastan 10–12: init, clone, status, add, commit, log, diff, branch, switch, merge, pull y push. Los demás se aprenden a medida que surgen las tareas.
¿En qué se diferencia git switch de git checkout?
git switch solo cambia de rama y crea ramas, mientras que git checkout además restaura archivos. La separación en switch y restore se hizo para no machacar cambios por confundir una rama con un archivo.
¿Cómo ver la ayuda de cualquier comando de Git?
Ejecuta git help nombre-del-comando para el manual completo o git nombre-del-comando -h para una lista breve de opciones. La misma documentación está en git-scm.com.
¿Se pueden acortar los comandos largos de Git?
Sí, con alias: git config --global alias.lg "log --oneline --graph --all" te permitirá escribir git lg.
¿Funcionan estos comandos en Windows?
Sí, los comandos son iguales en todos los sistemas. En Windows es cómodo ejecutarlos en Git Bash, PowerShell o el terminal del editor de código.
Este tema se explica a fondo y con práctica en el curso «Git desde cero hasta desarrollador seguro».
- Primer repositorio: init, add, commit y la magia del índice
- Leyendo el historial: log, diff, show y navegación por el pasado
- Ramas: la realidad paralela de tu código
- Deshaciendo cambios: restore, reset, revert — correcto y peligroso
- GitHub y repositorios remotos: tu código en la nube
- Herramientas avanzadas: rebase, stash, cherry-pick y etiquetas