Reconozco que durante mucho tiempo fui de esos que saltaban del terminal al navegador cada dos por tres. Voy a crear un issue, abro Firefox. Tengo que revisar un PR, abro Firefox. Necesito ver los últimos releases, otra vez Firefox. Me había acostumbrado a ese baile y no lo cuestionaba, hasta que un día probé gh y me di cuenta de cuánto tiempo perdía en cada salto. No es que no supiera que existía, es que no terminaba de entender qué podía aportarme. Ahora me parece una de esas herramientas que, una vez las pruebas, no entiendes cómo has podido vivir sin ellas.
¿Qué es GitHub CLI?
GitHub CLI es la herramienta oficial de GitHub para trabajar con la plataforma directamente desde la terminal. Nada de interfaces gráficas, nada de navegador, nada de click here, click there. Todo desde la línea de comandos, como Dios manda.
El binario se llama gh y está escrito en Go. Es pequeño, rápido, y no tiene dependencias externas. La versión actual es la v2.96.0, lanzada el 2 de julio de 2026, y el proyecto acumula ya más de 45.4k estrellas en GitHub. Vamos, que no es un proyecto muerto precisamente.
| Especificación | Valor |
|---|---|
| Versión actual | v2.96.0 (julio 2026) |
| Licencia | MIT |
| Lenguaje | Go (99.6%) |
| Repositorio | github.com/cli/cli |
| Estrellas | 45.4k |
| Releases | Cada ~2 semanas |
| Tamaño binario | ~14 MB (Linux amd64) |
La confusión más habitual es pensar que gh sustituye a git. No es así. gh es una herramienta complementaria que añade funcionalidades específicas de GitHub. Necesitas git para las operaciones locales (clone, push, pull, commit) y gh para todo lo que es específico de GitHub: pull requests, issues, releases, Actions, Codespaces, Discussions…
Y luego está hub, el predecesor. hub fue el CLI no oficial de GitHub durante años, pero su desarrollo está prácticamente parado. gh es el futuro, mantenido por el equipo oficial de GitHub con releases cada dos semanas. Si estás empezando, olvídate de hub y ve directamente a gh.
Instalación y configuración
Lo bueno de gh es que se instala en dos minutos y está disponible para todos los sistemas operativos. Vamos por partes.
En Ubuntu y Debian
El método oficial es añadir el repositorio apt de GitHub. Así te aseguras las actualizaciones automáticas:
curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo gpg --dearmor -o /usr/share/keyrings/githubcli-archive-keyring.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null sudo apt update && sudo apt install gh
En Fedora, CentOS y RHEL
Para los que usáis RPM, el proceso es igual de sencillo:
sudo dnf install 'dnf-command(config-manager)' sudo dnf config-manager --add-repo https://cli.github.com/packages/rpm/gh-cli.repo sudo dnf install gh
En Arch Linux
Los archusers lo tenéis aún más fácil:
sudo pacman -S github-cli
En macOS
Con Homebrew, un solo comando:
brew install gh
En Windows
Con WinGet, igual de simple:
winget install --id GitHub.cli
Verificación del binario
Desde la versión v2.50.0, los releases incluyen Build Provenance Attestation. Puedes verificar la integridad del binario con Sigstore:
gh attestation verify -R cli/cli gh_2.96.0_linux_amd64.tar.gz
Autenticación
Una vez instalado, el primer paso es autenticarte. gh te guía con un asistente interactivo:
gh auth login
Te preguntará si quieres autenticarte vía navegador o con un token. Si usas GitHub Enterprise, añade el flag --hostname:
gh auth login --hostname mi-empresa.ghe.com
Si prefieres automatizar, puedes usar variables de entorno:
export GH_TOKEN="ghp_tu_token_aqui"
O si estás en un entorno CI/CD, el token GITHUB_TOKEN que proporciona GitHub Actions también funciona.
Configuración básica
Un par de ajustes que te harán la vida más fácil. Configurar el editor y el protocolo:
gh config set editor vim gh config set git_protocol ssh
En mi caso, el editor es Vim, no podía ser de otra forma. Y el protocolo SSH, que es más seguro y no te pide contraseñas si tienes las claves configuradas.
Autocompletado
Si usas Bash, añade esto a tu ~/.bashrc:
eval "$(gh completion -s bash)"
Para Zsh o Fish, cambia el parámetro -s:
eval "$(gh completion -s zsh)"
Primeros pasos
Para comprobar que todo funciona, puedes ejecutar:
gh status
Esto te muestra un resumen de tus pull requests, issues y notificaciones. También puedes ver la información de un repositorio sin necesidad de clonarlo:
gh repo view cli/cli
Uso y funcionamiento
Aquí viene lo bueno. gh tiene comandos para prácticamente todo lo que puedas necesitar en GitHub. Te los voy desglosando por categorías.
Trabajando con repositorios
La gestión de repositorios es probablemente lo que más uses. Para clonar un repositorio sin tener que acordarte de la URL:
gh repo clone atareao/cookiecutter-python
Para crear un repositorio nuevo desde el directorio actual:
gh repo create mi-proyecto --public --source=. --remote=origin --push
Es interactivo, así que si no le pasas flags, te va preguntando. Si quieres hacer un fork de un repositorio:
gh repo fork cli/cli --clone
Y para ver la información de un repositorio sin moverte del terminal:
gh repo view atareao/cookiecutter-python --web
El flag --web lo abre en el navegador, pero si omites ese flag, te muestra la descripción, las estrellas, el lenguaje y el README directamente en la terminal.
Issues
Gestionar issues desde el terminal es una de esas cosas que una vez pruebas, no entiendes cómo no lo hacías antes. Para listar los issues abiertos:
gh issue list
Para listar los cerrados:
gh issue list -s closed
Para crear un issue nuevo:
gh issue create --title "Mejorar la documentación" --body "Falta la sección de instalación en el README"
Si tu repositorio usa tipos de issue (Issues 2.0, disponible desde v2.94.0):
gh issue create --type Bug --title "Error al cargar la página principal"
Para ver un issue en concreto con todos sus comentarios:
gh issue view 42 --comments
Para cerrar un issue:
gh issue close 42
Y para comentar:
gh issue comment 42 --body "Ya lo he revisado, parece que está solucionado"
Las labels también se gestionan desde el CLI:
gh label list gh label create bug --color FF0000 --description "Errores y fallos"
Pull Requests
Los pull requests son el pan de cada día de cualquier desarrollador que trabaje en equipo. Con gh puedes gestionarlos sin abrir el navegador.
Para listar los PRs abiertos:
gh pr list
Para crear un PR desde la rama actual:
gh pr create --fill
El flag --fill rellena el título y el cuerpo automáticamente a partir de los commits. Si quieres crearlo como draft:
gh pr create --draft --title "WIP: Refactor del módulo de autenticación"
Para ver un PR sin salir del terminal:
gh pr view 28
Para hacer checkout de un PR y probarlo localmente:
gh pr checkout 28
Esto te crea una rama local con el contenido del PR. Para ver el diff sin hacer checkout:
gh pr diff 28
Para revisar un PR (review):
gh pr review 28 --approve --body "LGTM, buen trabajo"
O si quieres solicitar cambios:
gh pr review 28 --request-changes --body "Falta manejar el caso de borde cuando el usuario no está autenticado"
Para mergear:
gh pr merge 28 --squash --delete-branch
Y si quieres que se mergee automáticamente cuando pasen los checks:
gh pr merge 28 --squash --auto
Releases
Gestionar releases desde el terminal es otra de esas cosas que agilizan mucho el flujo de trabajo. Para listar las releases:
gh release list
Para ver una release en concreto:
gh release view v1.2.3
Para crear una nueva release:
gh release create v1.2.3 --generate-notes --title "Versión 1.2.3"
El flag --generate-notes genera automáticamente las notas de release a partir de los commits. También puedes subir archivos:
gh release create v1.2.3 ./dist/app-linux.tar.gz ./dist/app-macos.zip --generate-notes
Para descargar archivos de una release:
gh release download v1.2.3 --pattern "*.tar.gz"
Gists
Los gists son esos snippets de código que compartes o guardas para ti. Con gh puedes gestionarlos sin problemas:
gh gist list gh gist create script.py --public gh gist edit 123abc gh gist view 123abc
Codespaces
Si usas Codespaces, gh te permite gestionarlos completamente desde el terminal. Para listar tus codespaces:
gh codespace list
Para crear uno nuevo:
gh codespace create --repo atareao/mi-proyecto --branch main
Para conectarte por SSH a un codespace:
gh codespace ssh
Para copiar archivos:
gh codespace cp archivo.txt remote:/workspace/
Para ver los puertos abiertos:
gh codespace ports
Y para parar un codespace (que no se te olvide, que cuesta dinero):
gh codespace stop
Workflows y Actions
GitHub Actions también se gestiona desde gh. Para listar los workflows de un repositorio:
gh workflow list
Para ejecutar un workflow manualmente:
gh workflow run tests.yml --ref main
Para ver el estado de las últimas ejecuciones:
gh run list --branch main --limit 5
Para ver el log de una ejecución en tiempo real:
gh run watch 12345
Para rerun un workflow que ha fallado:
gh run rerun 12345
Búsqueda
El comando gh search es una pasada. Te permite buscar en todo GitHub sin salir del terminal:
# Buscar repositorios gh search repos "topic:rust stars:>1000" # Buscar issues gh search issues "label:bug state:open" # Buscar PRs que me necesitan review gh search prs --review-requested @me --state open # Buscar código (nuevo en v2.90+) gh search code "function main" --repo cli/cli # Buscar commits gh search commits "fix security"
gh api: el comodín
Si hay algo que gh no cubre directamente, puedes usar gh api para hacer llamadas a la API de GitHub, tanto REST como GraphQL:
# GET a la API REST gh api repos/{owner}/{repo}/releases # POST con parámetros gh api repos/{owner}/{repo}/issues/123/comments -f body='Hola desde CLI' # GraphQL gh api graphql -f query='query { viewer { login } }' # Con paginación automática gh api repos/{owner}/{repo}/issues --paginate
gh en scripts y automatización
Aquí es donde gh muestra todo su potencial. No solo es interactivo, sino que está diseñado para ser usado en scripts.
Salida JSON estructurada
Casi todos los comandos de gh aceptan los flags --json y --jq. Esto te permite obtener la información en formato JSON y procesarla con herramientas como jq:
# Listar PRs en JSON gh pr list --json number,title,author,createdAt # Filtrar con jq gh pr list --json number,title,labels --jq '.[] | select(.labels | length > 0)' # Extraer URLs de PRs gh pr list --json url --jq '.[].url'
Go templates
Además de JSON, gh también soporta Go templates para formatear la salida:
gh pr list --json number,title,author,createdAt --template \ '{{range .}}{{tablerow (printf "#%v" .number) .title .author.login (timeago .createdAt)}}{{end}}'
Variables de entorno
gh respeta muchas variables de entorno que te permiten configurarlo sin tocar archivos:
| Variable | Descripción |
|---|---|
GH_TOKEN | Token de autenticación |
GITHUB_TOKEN | Token alternativo (compatible con Actions) |
GH_HOST | Hostname de GitHub por defecto |
GH_REPO | Repositorio en formato OWNER/REPO |
GH_EDITOR | Editor para texto |
GH_BROWSER | Navegador para abrir enlaces |
GH_DEBUG | Verbose output |
NO_COLOR | Desactivar colores |
gh en hooks de git y cron
Los hooks de git son un caso de uso perfecto para gh. Por ejemplo, puedes tener un hook prepare-commit-msg que etiquete automáticamente los commits con el número del issue si la rama contiene un número de issue:
#!/bin/bash BRANCH_NAME=$(git rev-parse --abbrev-ref HEAD) ISSUE_NUMBER=$(echo "$BRANCH_NAME" | grep -oP '\d+') if [ -n "$ISSUE_NUMBER" ]; then echo " [#$ISSUE_NUMBER]" >> "$1" fi
O un cron que te recuerde los PRs pendientes de revisar cada mañana:
0 9 * * 1-5 /usr/bin/gh search prs --review-requested @me --state open --json title,url >> ~/pending_reviews.log
Script completo de ejemplo
Te dejo un script que combina varias operaciones típicas en un flujo de release automatizado:
#!/bin/bash set -euo pipefail VERSION="${1:-v$(date +%Y.%m.%d)}" echo "=== Creando release $VERSION ===" # Crear tag git tag -a "$VERSION" -m "Release $VERSION" git push origin "$VERSION" # Crear release con notas automáticas gh release create "$VERSION" --generate-notes --target main # Subir artifacts gh release upload "$VERSION" ./dist/*.tar.gz # Esperar a que los workflows pasen gh run watch $(gh run list --limit 1 --json databaseId --jq '.[0].databaseId') echo "=== Release $VERSION completada ==="
gh con jq: consultas avanzadas
Combinar gh --json con jq te permite hacer consultas muy potentes en una sola línea:
# Contar issues por label gh issue list --json labels --jq 'group_by(.labels[].name) | map({label: .[0].labels[0].name, count: length})' # Obtener el último release gh release list --json tagName,createdAt --jq '.[0]' # Filtrar PRs sin reviews gh pr list --json number,title,reviews --jq \ 'map(select(.reviews | length == 0)) | .[:5]'
Esto es ideal para integraciones, dashboards o simplemente para obtener métricas rápidas de tu repositorio sin tener que instalar herramientas externas.
gh en CI/CD con GitHub Actions
Los runners oficiales de GitHub ya incluyen gh preinstalado y actualizado semanalmente. No necesitas instalar nada. En un workflow de Actions, lo usas así:
name: CI on: [push] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: gh issue list --limit 5 env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Create Release if: startsWith(github.ref, 'refs/tags/') run: | gh release create ${GITHUB_REF#refs/tags/} \ --generate-notes \ --title "Release ${GITHUB_REF#refs/tags/}" env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
Integración con just
Si no conoces just, te estás perdiendo una de las herramientas más útiles del ecosistema Rust. just es un command runner como Make, pero mucho más simple, sin tabuladores, sin reglas crípticas.
Combinar just con gh es una combinación ganadora. Te dejo un justfile con las recetas que uso en mi día a día:
# justfile alias p := pr # Crear PR desde rama actual pr: gh pr create --fill # Revisar PRs pendientes review: gh pr list --json number,title,author,headRefName --template \ '{{range .}}#{{.number}} {{.title}} ({{.author.login}}) [{{.headRefName}}]{{\n}}{{end}}' # Mergear PR actual merge: gh pr merge --squash --delete-branch # Lanzar release release version: gh release create {{version}} --generate-notes echo "Release {{version}} creado!" # Ver estado del repo status: gh status # Issues asignados a mí my-issues: gh search issues --assignee @me --state open # Sincronizar fork sync-fork: gh repo sync -b main # Abrir repo en navegador open: gh browse # Ver CI de la rama actual ci: gh run list --branch $(git branch --show-current) --limit 5 # Flujo completo: feature -> PR -> merge feature name: git checkout -b feature/{{name}} git commit --allow-empty -m "feat: {{name}}" git push -u origin feature/{{name}} gh pr create --fill
Con esto, en lugar de teclear comandos largos cada vez, simplemente ejecutas just pr o just release v1.2.3. La productividad se nota.
Extensiones
El ecosistema de extensiones de gh es uno de sus puntos fuertes. Las extensiones son repositorios de GitHub con el topic gh-extension que gh descarga y ejecuta como subprocesos. Pueden estar escritas en cualquier lenguaje.
Gestión de extensiones
# Instalar una extensión gh extension install dlvhdr/gh-dash # Listar extensiones instaladas gh extension list # Actualizar todas gh extension upgrade --all # Eliminar gh extension remove gh-dash # Buscar extensiones gh extension search dashboard
Extensiones imprescindibles
gh-dash (12.1k ⭐) es una TUI completa para GitHub. Secciones configurables de PRs e issues, atajos de teclado estilo vim, diff, checkout, merge, comentar. Está escrito en Go con Bubble Tea. Una maravilla:
gh extension install dlvhdr/gh-dash gh dash
gh-aw (4.8k ⭐) te permite escribir flujos agentic en markdown natural y ejecutarlos en GitHub Actions. Soporta Copilot, Claude, Codex y Gemini:
gh extension install github/gh-aw gh aw init gh aw add --create-pull-request
gh-act (110 ⭐) es un wrapper para nektos/act que te permite ejecutar GitHub Actions localmente con Docker:
gh extension install nektos/gh-act gh act
gh-poi (979 ⭐) limpia ramas locales de forma segura después de mergear el PR:
gh extension install seachicken/gh-poi gh poi
Crear tu propia extensión
Si necesitas algo muy específico, crear una extensión es trivial. El repositorio debe tener un script ejecutable con el mismo nombre que la extensión:
gh extension create mi-extension cd gh-mi-extension
Dentro del directorio, creas un script ejecutable (bash, Python, Go, lo que quieras) que se llame gh-mi-extension. El script puede usar gh internamente, leer variables de entorno como GH_DEBUG o GH_HOST, y hacer lo que necesites.
Un ejemplo mínimo en bash:
#!/bin/bash echo "Hola desde mi extensión" echo "Repositorio actual: $(gh repo view --json name --jq '.name')"
Lo publicas en GitHub con gh repo create --public --source=. y los usuarios lo instalan con:
gh extension install tu-usuario/gh-mi-extension
Integración con IA: MCPs y Skills
Esto es lo más nuevo y probablemente lo que más va a marcar el futuro de gh. La integración con agentes de inteligencia artificial está cambiando la forma de trabajar.
gh skill
Desde la versión v2.91.0, gh incluye un sistema de skills para agentes de IA. Permite instalar skills que los agentes (Claude Code, Copilot coding agent, etc.) pueden usar para entender nuevas funcionalidades:
# Instalar el skill de gh para Claude Code gh skill install cli/cli gh --scope user # Actualizar skills gh skill update gh # Listar skills instalados gh skill list # Buscar skills disponibles gh skill search
Esto significa que los agentes de IA pueden aprender a usar nuevas funcionalidades de gh el mismo día del release. Una pasada.
GitHub MCP Server
El GitHub MCP Server permite a los modelos de IA interactuar con GitHub a través del Model Context Protocol. La configuración es sencilla:
{ "mcpServers": { "github": { "command": "npx", "args": ["-y", "@modelcontextprotocol/server-github"], "env": { "GITHUB_PERSONAL_ACCESS_TOKEN": "<YOUR_TOKEN>" } } } }
Esto permite que un agente de IA pueda crear issues, revisar PRs, buscar código y gestionar repositorios directamente. Por ejemplo, puedes decirle a tu agente crea un issue con el título tal y asígnamelo a mí y el agente lo hará usando gh internamente.
GitHub Copilot CLI
El nuevo GitHub Copilot CLI (11k ⭐) ha reemplazado a la extensión gh-copilot (archivada). Es un agente conversacional completo que te permite interactuar con GitHub en lenguaje natural:
# Instalación curl -fsSL https://gh.io/copilot-install | bash # Uso copilot
Dentro del CLI, puedes preguntar cosas como ¿qué issues tengo asignados? o crea un PR con los últimos cambios. Soporta Claude Sonnet 4.5, GPT-5 y más modelos. Incluye comandos como /help, /model, /feedback, y un modo autopilot experimental.
gh-aw: GitHub Agentic Workflows
La extensión gh-aw te permite escribir flujos de trabajo agentic en markdown natural. El agente interpreta el markdown y ejecuta las acciones en GitHub Actions:
gh extension install github/gh-aw gh aw init gh aw add --create-pull-request
Puedes definir flujos como cuando se cree un issue con la label bug, crear un PR con la solución y el agente se encarga de todo. Soporta múltiples proveedores de IA.
gh en herramientas de IA del día a día
Hoy en día, gh se usa como herramienta base en la mayoría de coding agents. Claude Code lo usa para operaciones de GitHub. Cursor y Windsurf también lo integran para crear PRs, issues y reviews. La presencia de gh en el sistema es casi un requisito para que estos agentes funcionen correctamente con repositorios de GitHub.
Pros y Contras
Para ser honesto, no todo es perfecto. Aquí te dejo mi valoración sincera después de usarlo a diario.
Ventajas:
- Todo desde el terminal, sin cambiar de contexto. La productividad que ganas es notable.
--jsony--jqhacen que sea perfecto para scripting y automatización.gh apite da acceso a toda la API de GitHub sin necesidad de curl ni tokens manuales.- El ecosistema de extensiones es muy activo, con más de 948 extensiones disponibles.
- Es mantenido por el equipo oficial de GitHub, con releases cada dos semanas.
- La integración con IA (skills, MCP, Copilot CLI) es el futuro y ya está aquí.
Inconvenientes:
- No reemplaza a
git. Necesitas tener ambos. Operaciones como rebase interactivo, stash o cherry-pick siguen siendo cosa degit. - La curva de aprendizaje existe. Si no estás familiarizado con la API de GitHub,
gh apipuede resultar abrumador. - Algunas funcionalidades avanzadas de GitHub (Projects con vistas complejas, Insights) no están cubiertas.
- Las extensiones de terceros pueden tener problemas de seguridad. Revisa siempre lo que instalas.
- El output en terminal puede ser abrumador si no usas
--jsono--jqpara filtrar.
Conclusión
Llegados a este punto, la pregunta es ¿merece la pena? Desde mi experiencia, rotundamente sí. gh se ha convertido en una herramienta indispensable en mi día a día. No solo por la comodidad de no tener que abrir el navegador cada dos minutos, sino por todo lo que permite automatizar.
Si trabajas con GitHub a diario, gh te va a ahorrar horas. Si además usas just para definir recetas, la combinación es letal. Y si te interesa el mundo de los agentes de IA, el ecosistema de skills y MCPs de gh te va a dar mucho juego.
Como alternativas, tienes hub (el predecesor, prácticamente muerto) y glab (el CLI de GitLab, que está inspirado en gh). Pero si trabajas con GitHub, gh es la herramienta oficial y la recomendada.
Así que ya sabes, instala gh, autentícate, y empieza a probar. Te aseguro que no vas a querer volver atrás.
Más información,
- Repositorio oficial de gh CLI
- Manual completo de GitHub CLI
- Documentación oficial de gh en docs.github.com
- Releases y changelog de gh
- Extensiones de gh en GitHub Topics
- gh-dash — TUI para GitHub
- gh-aw — GitHub Agentic Workflows
- gh-act — Ejecutar Actions localmente
- GitHub MCP Server
- GitHub Copilot CLI
- just — command runner
- jq — procesador JSON
- glab — GitLab CLI
- Comparativa gh vs hub