🐙 Git y GitHub CLI

Multilingual DevOps cheat sheet: Linux, Docker, Git, Kubernetes, Helm, Terraform, practical scenarios & templates.
Publicado

31 de agosto de 2025

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

git grep -n "TODO"

Encontrar líneas con 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 importar mayúsculas o minúsculas (coincide con Login, LOGIN, login, etc.)

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 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 actual

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 main

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

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

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

Obtener y fusionar cambios de la rama remota main en la rama actual

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

git fetch Descargar cambios de un remoto sin fusionar
git fetch origin

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

git fetch origin main

Obtener solo la rama main del remoto

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

📦 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 v1.0 con un mensaje (guardada como objeto completo de Git, útil para releases)

git tag -d v1.0

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

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

git push origin :refs/tags/v1.0

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

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

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

git submodule sync --recursive

Sincronizar URLs de submódulos tras 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 (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 .tar.gz desde el HEAD actual

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

Crear un .tar.gz comprimido del proyecto actual, colocando todos los archivos dentro de una carpeta llamada project/ en el archivo

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

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

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 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 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 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 (con 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 agregar el remoto llamado upstream

💡 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-branch. Usar con precaución

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