🐙 Git y GitHub CLI
Comandos básicos y avanzados de Git para control de versiones, ramas, repos remotos, stash, tags y GitHub CLI.
🔹 Comandos básicos
| Comando | Ejemplo | Descripción | 
|---|---|---|
| git add | Agregar un archivo al área de preparación (staging) | |
| git add file.txt | Preparar un archivo específico para el próximo commit | |
| git add . | Preparar todos los cambios en el directorio actual y subdirectorios | |
| git add -p | Elegir interactivamente qué partes de archivos preparar (útil para commits parciales) | |
| git clone | Clonar un repositorio en un nuevo directorio | |
| git clone -b branch_name URL | Clonar solo la rama especificada (en lugar de la predeterminada) | |
| git clone --depth 1 URL | Clonar solo el último commit, creando una copia superficial para ahorrar tiempo y espacio | |
| git commit | Registrar cambios en el repositorio | |
| git commit -m "Initial commit" | Hacer commit con un mensaje sin abrir el editor | |
| git commit -a -m "Fix bugs" | Preparar y hacer commit de todos los archivos modificados con un mensaje | |
| git commit --amend | Actualizar el último commit (cambiar mensaje o incluir más cambios) | |
| git commit --fixup abc1234 | Crear un commit de corrección (fixup) para hacer squash automáticamente después en un rebase interactivo | |
| git config | Obtener y establecer opciones del repositorio o globales | |
| git config --global user.name "Name" | Configurar nombre de usuario global en Git | |
| git config --global user.email "email@example.com" | Configurar correo electrónico global en Git | |
| git config --list | Listar todas las configuraciones de Git (nombre, email, editor, etc.) | |
| git diff | Mostrar cambios entre commits, commit y árbol de trabajo, etc. | |
| git diff HEAD | Mostrar lo que cambiaste desde el último commit (cambios no preparados) | |
| git diff --staged | Mostrar lo que se incluirá en el próximo commit | |
| git diff --word-diff HEAD~1 | Mostrar cambios con diferencias a nivel de palabras | |
| git grep | Buscar dentro de archivos del repositorio | |
| git grep "functionName" | Encontrar todas las menciones de  | |
| git grep -n "TODO" | Buscar líneas que contengan  | |
| git grep -i "login" | Buscar la palabra  | |
| git init | Crear un repositorio Git vacío o reinicializar uno existente | |
| git init my-project | Inicializar un nuevo repositorio en el directorio my-project | |
| git init --bare | Inicializar un repositorio bare | |
| git log | Mostrar historial de commits | |
| git log --oneline | Mostrar historial en formato compacto de una sola línea | |
| git log --graph --all | Mostrar todas las ramas en un gráfico visual de commits | |
| git log -p --stat | Mostrar parches y estadísticas de cambios en commits | |
| git reset | Quitar archivos del área de preparación, manteniendo los cambios en el directorio de trabajo | |
| git reset HEAD file.txt | Quitar un archivo de staging (manteniendo tus ediciones) | |
| git reset --hard HEAD~1 | Regresar un commit atrás y borrar todos los cambios (¡irreversible!) | |
| git reset --soft HEAD~1 | Deshacer el último commit pero mantener cambios listos para volver a hacer commit | |
| git reset --mixed HEAD~1 | Deshacer un commit pero mantener los cambios sin preparar en el directorio de trabajo | |
| git show | Mostrar varios tipos de objetos | |
| git show <commit_hash> | Mostrar cambios y mensaje de un commit específico | |
| git show HEAD~1 | Mostrar el commit anterior al actual | |
| git show --stat | Mostrar un resumen de cambios de archivos del último commit | |
| git status | Mostrar el estado del árbol de trabajo | |
| git status -s | Mostrar estado en formato corto | |
| git status -b | Mostrar la rama actual y el estado de los archivos | 
🌿 Ramas y fusiones
| Comando | Ejemplo | Descripción | 
|---|---|---|
| git branch | Crear, listar o eliminar ramas | |
| git branch new-feature | Crear una nueva rama llamada  | |
| git branch -d old-feature | Eliminar una rama local llamada  | |
| git checkout | Cambiar de rama o restaurar archivos de otro commit | |
| git checkout main | Cambiar a la rama  | |
| git checkout -b new-branch | Crear y cambiar a una nueva rama llamada  | |
| git switch | Cambiar de rama (alternativa simplificada a checkout) | |
| git switch main | Cambiar a la rama  | |
| git switch -c feature-x | Crear y cambiar a una nueva rama llamada  | |
| git switch new-feature | Cambiar a una rama existente llamada  | |
| git merge | Combinar cambios de otra rama en la actual | |
| git merge new-feature | Fusionar la rama  | |
| git merge --no-ff new-feature | Crear siempre un commit de merge (incluso si es fast-forward) | |
| git merge --abort | Cancelar la fusión y revertir cambios si ocurren conflictos | |
| git rebase | Mover o reaplicar commits sobre un nuevo commit base | |
| git rebase main | Reaplicar commits de tu rama encima de la rama  | |
| git rebase -i HEAD~3 | Editar interactivamente los últimos 3 commits | |
| git rebase --abort | Detener y deshacer un rebase en progreso | |
| git rebase -i --autosquash HEAD~5 | Hacer squash automáticamente de commits marcados como fixup o squash durante un rebase interactivo | |
| git cherry-pick | Aplicar commits específicos de otra rama | |
| git cherry-pick <hash> | Aplicar un commit específico (por hash) a la rama actual | |
| git cherry-pick --continue | Continuar cherry-pick después de resolver conflictos | |
| git cherry-pick A^..B | Aplicar un rango de commits desde  | 
📡 Repositorios remotos
| Comando | Ejemplo | Descripción | 
|---|---|---|
| git remote | Administrar enlaces a repositorios remotos (como GitHub) | |
| git remote -v | Mostrar nombres remotos y sus URLs | |
| git remote add origin URL | Agregar un repositorio remoto llamado  | |
| git pull | Descargar y fusionar automáticamente cambios de una rama remota | |
| git pull origin main | Obtener y fusionar cambios de la rama remota  | |
| git pull --rebase origin main | Obtener y rebasar tu rama actual encima de la rama remota en lugar de fusionar | |
| git push | Subir cambios locales a un repositorio remoto | |
| git push origin main | Subir tu rama  | |
| git fetch | Descargar cambios del remoto sin fusionar | |
| git fetch origin | Obtener todas las actualizaciones del remoto  | |
| git fetch origin main | Obtener solo la rama  | |
| git fetch --all | Obtener actualizaciones de todos los remotos | |
| git fetch --prune | Limpiar ramas eliminadas — borrar referencias locales a ramas eliminadas remotamente | |
| git fetch --dry-run | Mostrar qué se obtendría sin descargar nada | |
| git fetch origin +main | Actualizar forzadamente tu rama de seguimiento local ( | 
📦 Stash y limpieza
| Comando | Ejemplo | Descripción | 
|---|---|---|
| git stash | Guardar temporalmente cambios no confirmados (trabajo en progreso) | |
| git stash | Guardar archivos modificados y preparados, luego revertir directorio a último commit | |
| git stash apply | Reaplicar los últimos cambios guardados en stash (stash permanece guardado) | |
| git stash pop | Reaplicar y eliminar el último stash | |
| git stash list | Mostrar lista de todos los cambios en stash | |
| git stash branch feature-fix | Crear una nueva rama y aplicar el último stash en ella | |
| git clean | Eliminar permanentemente archivos no rastreados (fuera de Git) | |
| git clean -f | Eliminar archivos no rastreados en el directorio actual | |
| git clean -fd | Eliminar archivos y carpetas no rastreados | |
| git clean -n | Previsualizar lo que será eliminado (ejecución segura) | 
🏷️ Etiquetas
| Comando | Ejemplo | Descripción | 
|---|---|---|
| git tag | Crear, listar o eliminar etiquetas para marcar puntos específicos en la historia (como versiones) | |
| git tag -a v1.0 -m "Version 1.0" | Crear una etiqueta anotada llamada  | |
| git tag -d v1.0 | Eliminar la etiqueta local llamada  | |
| git push | Subir commits, ramas y etiquetas desde local al repositorio remoto | |
| git push origin --tags | Subir todas las etiquetas locales al remoto (útil tras etiquetar múltiples versiones) | |
| git push origin v1.0 | Subir una etiqueta específica (ej.  | |
| git push origin :refs/tags/v1.0 | Eliminar la etiqueta remota  | 
🛠️ Resolución de conflictos
| Comando | Ejemplo | Descripción | 
|---|---|---|
| git mergetool | Abrir una herramienta visual para ayudar a resolver conflictos de fusión | |
| git mergetool --tool=meld | Usar una herramienta específica (como Meld) para resolver conflictos | |
| git rerere | Permitir que Git recuerde cómo resolviste conflictos previamente | |
| git config --global rerere.enabled true | Habilitar reutilización automática de resoluciones pasadas | |
| git rerere status | Mostrar qué archivos tienen resoluciones de conflictos guardadas | |
| git rerere diff | Mostrar qué cambios guardó Git para uso futuro | 
⚙️ Comandos avanzados
| Comando | Ejemplo | Descripción | 
|---|---|---|
| git bisect | Usar búsqueda binaria para encontrar el commit que introdujo un error | |
| git bisect start | Iniciar búsqueda binaria entre un commit bueno y uno malo para localizar un bug | |
| git bisect bad | Marcar el commit actual como “malo” (contiene el bug) | |
| git bisect good <commit> | Marcar un commit conocido como “bueno” donde no existía el bug | |
| git blame | Mostrar quién modificó por última vez cada línea de un archivo, con revisión y autor | |
| git blame file.txt | Mostrar autor e info de commit por cada línea del archivo | |
| git blame -L 10,20 file.txt | Mostrar información solo para las líneas 10 a 20 | |
| git blame --show-email file.txt | Mostrar correos electrónicos de autores junto a cambios de línea | |
| git reflog | Ver y administrar el registro de referencias (reflog) de movimientos de ramas y HEAD | |
| git reflog show main@{1.week.ago} | Ver dónde apuntaba la rama  | |
| git reflog expire --expire=30.days --dry-run | Previsualizar qué entradas del reflog de más de 30 días pueden limpiarse (sin cambios) | |
| git reflog delete HEAD@{2} | Eliminar una entrada específica del reflog (usar con cuidado, puede afectar recuperación) | |
| git submodule | Agregar, inicializar, actualizar o inspeccionar submódulos (repositorios dentro de repositorios) | |
| git submodule add URL path | Agregar un repositorio externo como submódulo en la ruta especificada | |
| git submodule update --init | Inicializar y descargar todos los submódulos listados en el repositorio | |
| git submodule foreach git pull | Ejecutar  | |
| git submodule sync --recursive | Sincronizar URLs de submódulos tras cambios en el archivo  | |
| git submodule update --remote --merge | Actualizar submódulos al último commit de sus ramas remotas | |
| git archive | Crear un archivo comprimido (zip, tar, etc.) de archivos desde un commit o rama específica | |
| git archive --format=zip HEAD > archive.zip | Crear un archivo ZIP de los archivos actuales en HEAD | |
| git archive -o release.tar.gz HEAD | Crear un archivo comprimido  | |
| git archive --format=tar --prefix=project/ HEAD \| gzip > project.tar.gz | Crear un archivo comprimido  | |
| git gc | Limpiar archivos innecesarios y optimizar el repositorio para rendimiento | |
| git gc --aggressive | Realizar limpieza y optimización completa (puede ser lenta pero efectiva) | |
| git gc --prune=now | Eliminar todos los objetos inalcanzables inmediatamente (peligroso si no estás seguro) | |
| git shortlog | Resumen rápido de autores y sus commits | |
| git shortlog -e | Mostrar lista de autores con sus correos electrónicos (ej. para analizar quién contribuyó y cuánto) | |
| git shortlog -s -n | Mostrar cuántos commits hizo cada autor, ordenados por número de commits | |
| git shortlog -sne | Igual que el anterior, pero incluyendo nombres y correos — útil para seguimiento detallado de actividad | |
| git revert | Crear un nuevo commit que deshace cambios de un commit anterior sin reescribir la historia | |
| git revert HEAD | Deshacer el último commit creando un nuevo commit que revierta sus cambios | |
| git revert <commit_hash> | Deshacer un commit específico por hash, agregando un commit nuevo que lo revierte de forma segura | 
🐙 GitHub CLI
ghte permite administrar GitHub desde la terminal.
| Comando | Ejemplo | Descripción | 
|---|---|---|
| gh auth login | Autentícate con un host de GitHub para permitir que los comandos CLI interactúen con tu cuenta | |
| gh auth login --with-token < mytoken.txt | Autenticarse usando un token de acceso personal guardado en un archivo ( | |
| gh auth login --hostname enterprise.internal | Autenticarse en un servidor GitHub Enterprise (no github.com) | |
| gh repo clone | Clonar un repositorio de GitHub en tu máquina local | |
| gh repo clone user/repo | Clonar el repositorio repo propiedad de  | |
| gh repo clone cli/cli -- --depth=1 | Clonar el repositorio pero solo descargar el último commit para una clonación más rápida y ligera | |
| gh repo clone cli/cli workspace/cli | Clonar el repositorio en una carpeta personalizada  | |
| gh issue list | Listar issues en un repositorio de GitHub, opcionalmente filtrados por varios criterios | |
| gh issue list --assignee "@me" | Listar issues asignados a ti | |
| gh issue list --state all | Listar issues sin importar el estado (abiertos o cerrados) | |
| gh issue list --search "error no:assignee sort:created-asc" | Listar issues que coincidan con “error”, no asignados, ordenados por fecha de creación ascendente | |
| gh pr create | Crear un pull request en GitHub vía CLI | |
| gh pr create --title "..." | Crear un pull request con el título dado | |
| gh pr create --project "Roadmap" | Vincular el pull request a un proyecto de GitHub llamado “Roadmap” | |
| gh pr create --base develop --head monalisa:feature | Crear un PR desde la rama  | |
| gh repo create | Crear un nuevo repositorio de GitHub desde la CLI | |
| gh repo create my-project | Crear un nuevo repositorio llamado  | |
| gh repo create my-project --public --clone | Crear un repositorio público y clonarlo localmente | |
| gh repo create my-project --private --source=. --remote=upstream | Crear un repositorio remoto privado desde la carpeta actual y añadir un remoto llamado  | 
💡 Alias de Git (Atajos útiles)
Configura alias convenientes para acelerar comandos comunes de Git:
git config --global alias.br branch                                       # atajo para: git branch
git config --global alias.ci commit                                       # atajo para: git commit
git config --global alias.co checkout                                     # atajo para: git checkout
git config --global alias.graph "log --oneline --graph --all --decorate"  # historial gráfico legible
git config --global alias.last "log -1 HEAD"                              # mostrar el último commit
git config --global alias.st status                                       # atajo para: git status🚀 Comandos avanzados de Git para profesionales
| Comando | Ejemplo | Descripción | 
|---|---|---|
| git filter-repo | Una herramienta poderosa y eficiente para reescribir el historial de Git y eliminar o modificar archivos, autoría o rutas; reemplaza git filter-branchcon mayor velocidad y seguridad | |
| git filter-repo --path secret.txt --invert-paths | Reescribir de forma eficiente el historial de un repositorio para eliminar archivos o directorios sensibles sin los problemas de rendimiento de  | |
| git filter-repo --replace-text replacements.txt | Reemplazar en masa cadenas o patrones en todo el historial (ej. sanitizar credenciales) | |
| git filter-repo --subdirectory-filter src | Extraer el historial de un subdirectorio en un nuevo repositorio, preservando la metadata de commits | |
| git worktree | Gestionar múltiples directorios de trabajo vinculados a un solo repositorio, permitiendo trabajo concurrente en distintas ramas sin clonar | |
| git worktree add ../feature feature-branch | Crear un directorio de trabajo adicional adjunto al mismo repositorio, habilitando checkouts de ramas en paralelo sin clones | |
| git worktree list | Listar todos los worktrees activos, sus rutas y ramas asociadas | |
| git worktree remove ../feature | Eliminar un worktree vinculado cuando ya no sea necesario, limpiando los directorios de trabajo de forma segura | |
| git replace | Crear referencias temporales que sustituyen objetos existentes, permitiendo manipulación de historial local sin destrucción y pruebas | |
| git replace <old_commit> <new_commit> | Intercambiar temporalmente un commit por otro en tu repo local, útil para pruebas o parches de historial sin reescribirlo | |
| git replace --list | Mostrar todas las referencias de reemplazo activas | |
| git replace -d <replace_ref> | Eliminar una referencia de reemplazo específica para revertir el comportamiento | |
| git stash | Guardar temporalmente cambios no confirmados en una pila, permitiendo cambiar de contexto sin comprometer trabajo inacabado | |
| git stash push -p | Seleccionar interactivamente fragmentos de cambios para guardar en stash, brindando control granular sobre lo que se guarda | |
| git stash push -m "WIP selective stash" | Crear un stash con un mensaje personalizado para identificación más fácil | |
| git stash apply stash@{2} | Aplicar un stash específico de la lista sin eliminarlo | |
| git rebase | Reaplicar commits encima de otra base, facilitando un historial más limpio y lineal, así como edición interactiva del historial | |
| git rebase --interactive --autosquash | Iniciar una sesión de rebase interactivo que automáticamente reordena y combina commits marcados como fixup o squash, limpiando el historial | |
| git rebase -i --autosquash HEAD~10 | Reordenar y combinar automáticamente commits marcados como fixup o squash antes de hacer push | |
| git commit --fixup <commit> | Crear un commit fixup que será combinado automáticamente durante un rebase interactivo | |
| git commit --squash <commit> | Crear un commit squash para combinar con un commit específico en el rebase | |
| git bisect | Herramienta de búsqueda binaria para identificar eficientemente el commit que introdujo un bug, probando commits sucesivos y acotando el cambio problemático | |
| git bisect run | Automatizar el proceso de bisect ejecutando un script de prueba en cada commit para identificar rápidamente el que introdujo el bug sin intervención manual | |
| git bisect start; git bisect bad; git bisect good v1.0; git bisect run ./test.sh | Automatizar el proceso ejecutando un script de prueba en cada commit, acelerando la identificación del bug | |
| git bisect visualize | Abrir una herramienta gráfica para visualizar el proceso de bisect | |
| git bisect reset | Salir del modo bisect y volver al HEAD original | |
| git commit | Registrar cambios en el repositorio con opciones detalladas de enmienda, firma, fixup y personalización de mensajes para mantener un historial de calidad | |
| git commit --gpg-sign | Crear un commit firmado con tu clave GPG para asegurar verificación criptográfica de la autenticidad y autoría | |
| git commit -S -m "Signed commit" | Firmar criptográficamente tus commits con tu clave GPG, asegurando integridad y verificación de autoría | |
| git config --global user.signingkey <key_id> | Configurar la clave GPG usada para firmar commits de manera global | |
| git log --show-signature | Verificar y mostrar la información de firma GPG de commits | |
| git reflog | Mantener un registro de actualizaciones a HEAD y ramas, esencial para recuperar commits perdidos y entender movimientos de historial local | |
| git reset --hard HEAD@{3} | Reiniciar la rama actual a un estado anterior desde reflog para recuperar o deshacer cambios | |
| git reflog expire --expire=now --all | Expirar inmediatamente todas las entradas de reflog, limpiando historial (usar con precaución) | 
🧰 Consejos de flujo de trabajo y automatización Pro
| Tema | Comandos / Ejemplo | Explicación y consejos Pro | 
|---|---|---|
| Limpieza agresiva del repositorio | git gc --aggressive --prune=now | Realiza recolección de basura profunda y poda objetos inalcanzables inmediatamente para optimización del repositorio. Usar en ventanas de mantenimiento | 
| Worktrees paralelos de ramas | git worktree add ../feature-branch feature | Mantener múltiples directorios de trabajo para desarrollo simultáneo de funciones, evitando la sobrecarga de clones | 
| Historial limpio y lineal | git rebase -i --autosquash | Antes de hacer push, realiza un rebase interactivo con autosquash para mantener un historial limpio y legible | 
| Commits seguros | git commit -S | Firmar commits con GPG para aumentar la confiabilidad en repositorios compartidos, obligatorio en muchos entornos empresariales | 
| Bisección automatizada | git bisect run ./test-script.sh | Automatizar la búsqueda de bugs ejecutando un script de prueba en cada commit candidato durante bisect | 
| Cache de resolución de conflictos | git config --global rerere.enabled true | Habilitar la reutilización de resoluciones de conflictos para acelerar la resolución en rebases o merges repetidos | 
| Alias y hooks compartidos | Almacenar alias de Git comunes y hooks de commits en un repo compartido o pipeline de CI para imponer estándares de equipo y mejorar productividad | 
Recursos adicionales
🧠 Consejo
No intentes memorizar todo. Usa --help, explora y practica regularmente:
git help <command>
git status🌐 Enlaces útiles
📘 Documentación oficial de Git — manual detallado de todos los comandos de Git:
https://git-scm.com/docs
📙 Learn Git Branching — tutorial visual interactivo para dominar conceptos de ramas:
https://learngitbranching.js.org
📕 Libro Pro Git (gratis, por Scott Chacon & Ben Straub):
https://git-scm.com/book
📗 Git Cheatsheet (referencia concisa oficial):
https://education.github.com/git-cheat-sheet-education.pdf