🐙 Git y GitHub CLI
Comandos básicos y avanzados de Git para control de versiones, ramas, repositorios remotos, stash, etiquetas 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 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 un 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 durante un rebase interactivo | |
| git config | Obtener y establecer opciones de 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, correo, editor, etc.) | |
| git diff | Mostrar cambios entre commits, entre un commit y el árbol de trabajo, etc. | |
| git diff HEAD | Mostrar los cambios desde el último commit (cambios no preparados) | |
| git diff --staged | Mostrar qué 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 los archivos del repositorio | |
| git grep "functionName" | Encontrar todas las menciones de  | |
| git grep -n "TODO" | Encontrar líneas con  | |
| git grep -i "login" | Buscar la palabra  | |
| git init | Crear un repositorio vacío de Git 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 historial de commits en formato compacto de una 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 por archivo en los commits | |
| git reset | Quitar archivos del área de preparación, manteniendo cambios en el directorio de trabajo | |
| git reset HEAD file.txt | Quitar un archivo del área de staging (mantiene tus ediciones) | |
| git reset --hard HEAD~1 | Regresar un commit y eliminar 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 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 de archivos en el ú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 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 | Siempre crear 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 los 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 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 de remotos y sus URLs | |
| git remote add origin URL | Agregar un repositorio remoto llamado  | |
| git pull | Descargar y fusionar automáticamente cambios desde una rama remota | |
| git pull origin main | Obtener y fusionar cambios de la rama remota  | |
| git pull --rebase origin main | Obtener y rebasear la rama actual encima de 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 de un 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 — quitar refs locales de ramas borradas en el remoto | |
| git fetch --dry-run | Mostrar qué se obtendría, sin descargar realmente nada | |
| git fetch origin +main | Forzar la actualización de 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 el directorio de trabajo al último commit | |
| git stash apply | Reaplicar los últimos cambios en stash (el stash permanece guardado) | |
| git stash pop | Reaplicar y eliminar el último stash | |
| git stash list | Mostrar la 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 qué se eliminará (ejecución segura en modo prueba) | 
🏷️ 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  | |
| git push | Subir commits, ramas y etiquetas del repositorio local al remoto | |
| git push origin --tags | Enviar todas las etiquetas locales al remoto (útil tras etiquetar varias versiones) | |
| git push origin v1.0 | Enviar 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 de merge (como Meld) para resolver conflictos | |
| git rerere | Permitir que Git recuerde cómo resolviste conflictos anteriormente | |
| git config --global rerere.enabled true | Habilitar la reutilización automática de resoluciones pasadas | |
| git rerere status | Mostrar qué archivos tienen resoluciones guardadas | |
| git rerere diff | Mostrar qué cambios guardó Git para reutilización futura | 
⚙️ Comandos avanzados
| Comando | 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 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 el bug no existía | |
| 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 para cada línea de un archivo | |
| git blame -L 10,20 file.txt | Mostrar blame solo para las líneas 10 a 20 | |
| git blame --show-email file.txt | Mostrar correos electrónicos de autores junto a cambios | |
| 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 de reflog mayores a 30 días pueden limpiarse (sin cambios aún) | |
| git reflog delete HEAD@{2} | Eliminar una entrada específica del reflog (usar con cuidado, puede afectar la 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 (zip, tar, etc.) de los archivos desde un commit o rama específica | |
| git archive --format=zip HEAD > archive.zip | Crear un archivo ZIP con 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  | |
| git gc | Limpiar archivos innecesarios y optimizar el repositorio para rendimiento | |
| git gc --aggressive | Realizar una limpieza y optimización a fondo (puede ser lenta pero efectiva) | |
| git gc --prune=now | Eliminar inmediatamente todos los objetos inalcanzables (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 contribuciones) | |
| git shortlog -s -n | Mostrar cuántos commits hizo cada autor, ordenados por cantidad | |
| git shortlog -sne | Igual que arriba, pero también incluye nombres y correos electrónicos — ú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 revierte sus cambios | |
| git revert <commit_hash> | Deshacer un commit específico por hash, creando un nuevo commit que lo revierte de forma segura | 
🐙 GitHub CLI
ghte permite administrar GitHub desde la terminal.
| Comando | Ejemplo | Descripción | 
|---|---|---|
| gh auth login | Autenticarse 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 almacenado en un archivo ( | |
| gh auth login --hostname enterprise.internal | Autenticarse 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 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”, sin asignar, ordenados por fecha de creación ascendente | |
| gh pr create | Crear un pull request en GitHub mediante 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 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 agregar el remoto llamado  | 
💡 Alias de Git (atajos útiles)
Configura alias convenientes para acelerar los 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 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
| Comando | Ejemplo | Descripción | 
|---|---|---|
| git filter-repo | Una herramienta poderosa y eficiente para reescribir el historial de Git para eliminar o modificar archivos, autoría o rutas; reemplaza git filter-branch con 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 cadenas o patrones en todo el historial (ej. sanear credenciales) | |
| git filter-repo --subdirectory-filter src | Extraer el historial de un subdirectorio en un nuevo repositorio, preservando metadatos de commits | |
| git worktree | Administrar múltiples directorios de trabajo vinculados a un solo repositorio, permitiendo trabajar en ramas diferentes sin clonar | |
| git worktree add ../feature feature-branch | Crear un directorio de trabajo adicional enlazado al mismo repositorio, permitiendo checkouts paralelos sin clones | |
| git worktree list | Listar todos los worktrees activos, sus rutas y ramas asociadas | |
| git worktree remove ../feature | Eliminar un worktree cuando ya no sea necesario, limpiando directorios de manera segura | |
| git replace | Crear referencias temporales que reemplazan objetos existentes, permitiendo manipulación y pruebas locales de historial sin destruirlo | |
| git replace <old_commit> <new_commit> | Intercambiar temporalmente un commit por otro en tu repositorio local, útil para pruebas sin reescribir el 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 cambiar de contexto sin confirmar trabajo incompleto | |
| git stash push -p | Seleccionar interactivamente fragmentos de cambios para guardar en stash, con control granular | |
| 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, además de edición interactiva | |
| git rebase --interactive --autosquash | Iniciar un rebase interactivo que reordena y hace squash automático de commits marcados como fixup o squash, limpiando el historial | |
| git rebase -i --autosquash HEAD~10 | Reordenar y hacer squash automáticamente de commits marcados como fixup o squash antes de enviar cambios | |
| git commit --fixup <commit> | Crear un commit fixup que será autosquasheado durante el 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 el commit que introdujo un bug probando commits sucesivos | |
| git bisect run | Automatizar el proceso de bisect ejecutando un script de prueba en cada commit para identificar rápidamente el commit con el bug | |
| 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 bisect | |
| git bisect reset | Salir del modo bisect y volver al HEAD original | |
| git commit | Registrar cambios en el repositorio con opciones detalladas para enmendar, firmar, fixup y personalizar mensajes, manteniendo un historial de calidad | |
| git commit --gpg-sign | Crear un commit firmado con tu clave GPG para asegurar autenticidad y autoría | |
| git commit -S -m "Signed commit" | Firmar criptográficamente tus commits con tu clave GPG para verificar integridad y 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 para profesionales
| Tema | Comandos / Ejemplo | Explicación y consejos pro | 
|---|---|---|
| Limpieza agresiva de repositorio | git gc --aggressive --prune=now | Realiza 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 features, evitando sobrecarga de clones | 
| Historial limpio y lineal | git rebase -i --autosquash | Antes de hacer push, rebasear interactivamente con autosquash para mantener el historial limpio y legible | 
| Commits seguros | git commit -S | Firmar commits con GPG para aumentar la confianza en repositorios compartidos, obligatorio en muchos entornos empresariales | 
| Búsqueda automatizada (bisect) | git bisect run ./test-script.sh | Automatizar la detección de bugs ejecutando un script de prueba en cada commit durante bisect | 
| Caché de resolución de conflictos | git config --global rerere.enabled true | Habilitar la reutilización de resoluciones de conflictos para acelerar merges o rebases repetidos | 
| Alias y hooks compartidos | Guardar alias 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 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 oficial concisa):
https://education.github.com/git-cheat-sheet-education.pdf