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

git grep -n "TODO"

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

git grep -i "login"

Buscar la palabra login sin importar mayúsculas/minúsculas

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

git branch -d old-feature

Eliminar una rama local llamada old-feature

git checkout Cambiar de rama o restaurar archivos de 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 actual
git merge new-feature

Fusionar la rama new-feature en la rama actual

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 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 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 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 remotos y sus URLs

git remote add origin URL

Agregar un repositorio remoto llamado origin

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

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

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

git fetch Descargar cambios del remoto sin fusionar
git fetch origin

Obtener todas las actualizaciones del remoto origin, pero sin aplicarlas

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

git tag -d v1.0

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

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. 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 (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 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)

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

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

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

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

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

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

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

Crear un nuevo repositorio llamado my-project en GitHub (se mostrarán indicaciones 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 un remoto llamado upstream

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

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