🐙 Git y GitHub CLI

Multilingual DevOps cheat sheet: Linux, Docker, Git, Kubernetes, Helm, Terraform, practical scenarios & templates.
Fecha de publicación

31 de agosto de 2025

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 functionName en todos los archivos del proyecto

git grep -n "TODO"

Encontrar líneas que contengan TODO y mostrar números de línea (útil para localizar notas en el código)

git grep -i "login"

Buscar la palabra login sin distinción de mayúsculas/minúsculas (coincide con Login, LOGIN, login, etc.)

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 new-feature

git branch -d old-feature

Eliminar una rama local llamada old-feature

git checkout Cambiar de rama o restaurar archivos desde otro commit
git checkout main

Cambiar a la rama main

git checkout -b new-branch

Crear y cambiar a una nueva rama llamada new-branch

git switch Cambiar de rama (alternativa simplificada a checkout)
git switch main

Cambiar a la rama main

git switch -c feature-x

Crear y cambiar a una nueva rama llamada feature-x

git switch new-feature

Cambiar a una rama existente llamada new-feature

git merge Combinar cambios de otra rama en la rama actual
git merge new-feature

Fusionar la rama new-feature en la rama actual

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 main

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 A (excluido) hasta B (incluido)

📡 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 origin

git pull Descargar y fusionar automáticamente cambios de una rama remota
git pull origin main

Traer y fusionar cambios de la rama remota main en tu rama actual

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 main al remoto origin

git fetch Descargar cambios del remoto sin fusionarlos
git fetch origin

Traer todas las actualizaciones del remoto origin, pero sin aplicarlas aún

git fetch origin main

Traer solo la rama main del remoto

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 (origin/main), sobrescribiendo conflictos

📦 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 v1.0 con un mensaje (se guarda como objeto completo en Git, bueno para lanzamientos)

git tag -d v1.0

Eliminar la etiqueta local llamada v1.0 (no afecta al remoto)

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., v1.0) al repositorio remoto

git push origin :refs/tags/v1.0

Eliminar la etiqueta remota v1.0 (nota la sintaxis con dos puntos)

🛠️ 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 main hace una semana

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 pull dentro de cada submódulo para actualizarlos a su último commit

git submodule sync --recursive

Sincronizar URLs de submódulos después de cambios en el archivo .gitmodules

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 .tar.gz comprimido desde el HEAD actual

git archive --format=tar --prefix=project/ HEAD \| gzip > project.tar.gz

Crear un archivo .tar.gz comprimido del proyecto actual, colocando todos los archivos dentro de una carpeta llamada project/ dentro del 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

gh te 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 (mytoken.txt)

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 repo propiedad de user en una carpeta llamada repo

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 workspace/cli

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 feature en el fork monalisa hacia la rama develop

gh repo create Crear un nuevo repositorio de GitHub desde CLI
gh repo create my-project

Crear un nuevo repositorio llamado my-project en GitHub (seguido de preguntas interactivas)

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 upstream

💡 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-branch. Usar con cuidado

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