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