🐙 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-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 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