🐙 Git y GitHub CLI
Comandos básicos y avanzados de Git para control de versiones, ramas, repos remotos, stash, etiquetas y GitHub CLI.
🔹 Comandos Básicos
| Dominio | Ejemplo | Descripción | 
|---|---|---|
| git add | Añadir 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 sus subdirectorios | |
| git add -p | Elegir interactivamente qué partes de los 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 rastreados 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 aplastarlo automáticamente más tarde durante un rebase interactivo | |
| git config | Obtener y establecer opciones del repositorio o globales | |
| git config --global user.name "Name" | Configurar el nombre de usuario global de Git | |
| git config --global user.email "email@example.com" | Configurar el correo electrónico global de Git | |
| git config --list | Listar todas las configuraciones de Git (nombre, email, editor, etc.) | |
| git diff | Mostrar cambios entre commits, entre commit y el á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 palabra | |
| git grep | Buscar dentro de los archivos del repositorio | |
| git grep "functionName" | Encontrar todas las menciones de  | |
| git grep -n "TODO" | Encontrar 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 (desnudo) | |
| git log | Mostrar el historial de commits | |
| git log --oneline | Mostrar el historial en un 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 archivos para los 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 del área de preparación (mantiene tus ediciones) | |
| git reset --hard HEAD~1 | Volver un commit atrás y borrar todos los cambios (¡irreversible!) | |
| git reset --soft HEAD~1 | Deshacer el último commit pero mantener los 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 los cambios en archivos del último commit | |
| git status | Mostrar el estado del árbol de trabajo | |
| git status -s | Mostrar el estado en formato corto | |
| git status -b | Mostrar la rama actual y el estado de los archivos | 
🌿 Ramas y Fusiones
| Dominio | 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 desde 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 rama actual | |
| git merge new-feature | Fusionar la rama  | |
| git merge --no-ff new-feature | Forzar la creación de un commit de fusión (incluso si es posible 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 tus commits de la 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 curso | |
| git rebase -i --autosquash HEAD~5 | Aplastar automáticamente commits marcados como fixup o squash durante el 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
| Dominio | Ejemplo | Descripción | 
|---|---|---|
| git remote | Gestionar enlaces a repositorios remotos (como GitHub) | |
| git remote -v | Mostrar nombres remotos y sus URLs | |
| git remote add origin URL | Añadir un repositorio remoto llamado  | |
| git pull | Descargar y fusionar automáticamente cambios de una rama remota | |
| git pull origin main | Traer y fusionar cambios de la rama remota  | |
| git pull --rebase origin main | Traer y rebasar tu rama actual sobre la rama remota en lugar de fusionar | |
| git push | Subir tus cambios locales a un repositorio remoto | |
| git push origin main | Enviar tu rama local  | |
| git fetch | Descargar cambios del remoto sin fusionarlos | |
| git fetch origin | Traer todas las actualizaciones del remoto  | |
| git fetch origin main | Traer solo la rama  | |
| git fetch --all | Traer actualizaciones de todos los remotos | |
| git fetch --prune | Limpiar ramas eliminadas — quitar referencias locales a ramas eliminadas remotamente | |
| git fetch --dry-run | Mostrar qué se traería, sin descargar nada realmente | |
| git fetch origin +main | Actualizar forzosamente tu rama de seguimiento local ( | 
📦 Stash y Limpieza
| Dominio | Ejemplo | Descripción | 
|---|---|---|
| git stash | Guardar temporalmente cambios no confirmados (trabajo en progreso) | |
| git stash | Guardar archivos modificados y preparados, luego revertir el directorio de trabajo al último commit | |
| git stash apply | Reaplicar los últimos cambios guardados (el stash permanece guardado) | |
| git stash pop | Reaplicar y eliminar el último stash | |
| git stash list | Mostrar lista de todos los cambios guardados 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 se eliminará (ejecución en modo seguro) | 
🏷️ Etiquetas
| Dominio | 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 del local al remoto | |
| git push origin --tags | Enviar todas las etiquetas locales al remoto (útil después de etiquetar varias versiones) | |
| git push origin v1.0 | Enviar una etiqueta específica (p. ej.,  | |
| git push origin :refs/tags/v1.0 | Eliminar la etiqueta remota  | 
🛠️ Resolución de Conflictos
| Dominio | Ejemplo | Descripción | 
|---|---|---|
| git mergetool | Abrir una herramienta visual para ayudar a resolver conflictos de fusión | |
| git mergetool --tool=meld | Usar una herramienta de fusión específica (como Meld) para resolver conflictos | |
| git rerere | Permitir que Git recuerde cómo resolviste conflictos de fusión antes | |
| git config --global rerere.enabled true | Habilitar la reutilización automática de resoluciones de conflictos pasadas | |
| git rerere status | Mostrar qué archivos tienen resoluciones de conflicto guardadas | |
| git rerere diff | Mostrar qué cambios guardó Git para reutilizarlos en el futuro | 
⚙️ Comandos Avanzados
| Dominio | Ejemplo | Descripción | 
|---|---|---|
| git bisect | Usar búsqueda binaria para encontrar el commit que introdujo un error | |
| git bisect start | Iniciar una búsqueda binaria entre un commit bueno conocido y uno malo para localizar un error | |
| git bisect bad | Marcar el commit actual como “malo” (contiene el error) | |
| git bisect good <commit> | Marcar un commit conocido como “bueno” donde no existía el error | |
| 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 el autor e información de commit para cada línea del archivo | |
| git blame -L 10,20 file.txt | Mostrar información de blame solo para las líneas de la 10 a la 20 | |
| git blame --show-email file.txt | Mostrar correos electrónicos de los autores junto a los cambios de línea | |
| git reflog | Ver y gestionar 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 reales) | |
| git reflog delete HEAD@{2} | Eliminar una entrada específica del reflog (usar con cuidado, ya que puede afectar la recuperación) | |
| git submodule | Añadir, inicializar, actualizar o inspeccionar submódulos (repositorios dentro de repositorios) | |
| git submodule add URL path | Añadir 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 después de 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 de un commit o rama específica | |
| git archive --format=zip HEAD > archive.zip | Crear un archivo ZIP de los archivos actuales del proyecto en HEAD | |
| git archive -o release.tar.gz HEAD | Crear un archivo  | |
| git archive --format=tar --prefix=project/ HEAD \| gzip > project.tar.gz | Crear un archivo  | |
| git gc | Limpiar archivos innecesarios y optimizar el repositorio para mejorar rendimiento | |
| git gc --aggressive | Realizar una limpieza y optimización profunda (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 una lista de autores con sus correos electrónicos (p. 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 también incluye nombres y correos electrónicos — útil para un seguimiento detallado de la 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 uno nuevo que revierta sus cambios | |
| git revert <commit_hash> | Deshacer un commit específico por hash, agregando de forma segura un nuevo commit que lo revierta | 
🐙 GitHub CLI
ghte permite gestionar GitHub desde la terminal.
| Dominio | 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 | Autenticar usando un token de acceso personal almacenado en un archivo ( | |
| gh auth login --hostname enterprise.internal | Autenticar en un servidor de 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  | |
| 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”, sin asignar, ordenados por fecha de creación ascendente | |
| gh pr create | Crear una pull request en GitHub mediante CLI | |
| gh pr create --title "..." | Crear una pull request con el título dado | |
| gh pr create --project "Roadmap" | Vincular la pull request a un proyecto de GitHub llamado “Roadmap” | |
| gh pr create --base develop --head monalisa:feature | Crear una PR desde la rama  | |
| gh repo create | Crear un nuevo repositorio de GitHub desde 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 el remoto llamado  | 
💡 Alias de Git (Atajos Útiles)
Configura alias convenientes para acelerar los comandos Git más comunes:
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 bonito en forma de gráfico
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
| Dominio | Ejemplo | Descripción | 
|---|---|---|
| git filter-repo | Una herramienta potente y eficiente para reescribir el historial de Git para eliminar o modificar archivos, autorías o rutas; reemplaza git filter-branchcon más velocidad y seguridad | |
| git filter-repo --path secret.txt --invert-paths | Reescribir eficientemente el historial del repositorio para eliminar archivos o directorios sensibles sin los problemas de rendimiento de  | |
| git filter-repo --replace-text replacements.txt | Reemplazar en bloque cadenas o patrones en todo el historial (p. 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 diferentes ramas sin clonar | |
| git worktree add ../feature feature-branch | Crear un directorio de trabajo adicional vinculado al mismo repositorio, permitiendo checkouts paralelos de ramas 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 se necesite, limpiando directorios de forma segura | |
| git replace | Crear referencias temporales que reemplazan objetos existentes, permitiendo manipulación local no destructiva del historial y pruebas | |
| git replace <old_commit> <new_commit> | Intercambiar temporalmente un commit por otro en tu repo local, útil para pruebas o parches sin reescribir historial | |
| 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 cambios de contexto sin hacer commit de trabajo incompleto | |
| git stash push -p | Seleccionar interactivamente fragmentos de cambios para guardar en stash, con control granular sobre lo que se guarda | |
| git stash push -m "WIP selective stash" | Crear un stash con un mensaje personalizado para identificarlo fácilmente | |
| git stash apply stash@{2} | Aplicar un stash específico de la lista, sin eliminarlo | |
| git rebase | Reaplicar commits sobre otra base, facilitando un historial más limpio y lineal y edición interactiva del historial | |
| git rebase --interactive --autosquash | Iniciar una sesión de rebase interactivo que reordena y aplasta automáticamente commits marcados como fixup o squash, limpiando el historial | |
| git rebase -i --autosquash HEAD~10 | Reordenar y aplastar automáticamente commits marcados como fixup o squash antes de hacer push | |
| git commit --fixup <commit> | Crear un commit fixup que se autosquashará durante el rebase interactivo | |
| git commit --squash <commit> | Crear un commit squash para combinarlo con un commit específico en el rebase | |
| git bisect | Herramienta de búsqueda binaria para identificar eficientemente el commit que introdujo un error probando sucesivos commits y acotando el cambio defectuoso | |
| git bisect run | Automatizar el proceso de bisect ejecutando un script de prueba en cada commit para identificar rápidamente el commit defectuoso sin intervención manual | |
| git bisect start; git bisect bad; git bisect good v1.0; git bisect run ./test.sh | Automatizar la búsqueda 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 bisección | |
| git bisect reset | Salir del modo bisect y volver al HEAD original | |
| git commit | Registrar cambios en el repositorio con opciones avanzadas para enmienda, firma, fixup y personalización de mensajes, manteniendo un historial de calidad | |
| git commit --gpg-sign | Crear un commit firmado con tu clave GPG para asegurar verificación criptográfica de 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 forma global | |
| git log --show-signature | Verificar y mostrar información de firmas GPG en los commits | |
| git reflog | Mantener un registro de actualizaciones de HEAD y ramas, esencial para recuperar commits perdidos y entender movimientos locales | |
| git reset --hard HEAD@{3} | Resetear la rama actual a un estado previo desde el reflog para recuperar o deshacer cambios | |
| git reflog expire --expire=now --all | Expirar inmediatamente todas las entradas del reflog, limpiando el historial (usar con precaución) | 
🧰 Consejos de Flujo de Trabajo y Automatización Pro
| Tema | Comandos / Ejemplo | Explicación y Consejos Pro | 
|---|---|---|
| Limpieza Agresiva de Repositorios | git gc --aggressive --prune=now | Realiza una recolección de basura profunda y poda objetos inalcanzables inmediatamente para optimizar el 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 funcionalidades, evitando la sobrecarga de clones | 
| Historial Limpio y Lineal | git rebase -i --autosquash | Antes de hacer push, rebasar interactivamente con autosquash para mantener un historial limpio y legible | 
| Commits Seguros | git commit -S | Firmar commits con GPG para aumentar la confianza en repos 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 | 
| Caché de Resolución de Conflictos | git config --global rerere.enabled true | Habilitar la reutilización de resoluciones de conflictos para acelerar la resolución repetida en rebases o merges | 
| Alias y Hooks Compartidos | Almacenar alias de Git comunes y hooks de commit en un repositorio compartido o pipeline CI para reforzar estándares de equipo y 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 Git:
https://git-scm.com/docs
📙 Learn Git Branching — tutorial visual interactivo para dominar conceptos de ramas:
https://learngitbranching.js.org
📕 Libro Pro Git (gratuito, de Scott Chacon & Ben Straub):
https://git-scm.com/book
📗 Chuleta oficial de Git (referencia concisa oficial):
https://education.github.com/git-cheat-sheet-education.pdf