gh CLI: GitHub en el terminal como un profesional

Vistas: 16315
gh CLI: GitHub en el terminal como un profesional

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ónValor
Versión actualv2.96.0 (julio 2026)
LicenciaMIT
LenguajeGo (99.6%)
Repositoriogithub.com/cli/cli
Estrellas45.4k
ReleasesCada ~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:

VariableDescripción
GH_TOKENToken de autenticación
GITHUB_TOKENToken alternativo (compatible con Actions)
GH_HOSTHostname de GitHub por defecto
GH_REPORepositorio en formato OWNER/REPO
GH_EDITOREditor para texto
GH_BROWSERNavegador para abrir enlaces
GH_DEBUGVerbose output
NO_COLORDesactivar 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.
  • --json y --jq hacen que sea perfecto para scripting y automatización.
  • gh api te 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 de git.
  • La curva de aprendizaje existe. Si no estás familiarizado con la API de GitHub, gh api puede 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 --json o --jq para 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,

Deja una respuesta