🐙 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