Búsqueda en el historial
Aprende técnicas avanzadas para buscar y filtrar información en el historial de Git, permitiéndote encontrar rápidamente commits, cambios específicos y entender la evolución del código.
Cristian Escalante
Última actualización: 1 de mayo de 2025
Búsqueda en el historial
A medida que un proyecto crece, el historial de Git se vuelve cada vez más extenso. Encontrar información específica en este historial puede ser como buscar una aguja en un pajar si no conoces las herramientas adecuadas. En esta lección, aprenderás técnicas avanzadas para buscar y filtrar el historial de Git, lo que te permitirá encontrar rápidamente los commits, cambios o información que necesitas.
Búsqueda básica con git log
El comando git log
es el punto de partida para explorar el historial, pero sus opciones de filtrado lo convierten en una poderosa herramienta de búsqueda.
Filtrar por autor
# Buscar commits de un autor específico
git log --author="Juan Pérez"
# Usar expresiones regulares
git log --author="Juan\|María"
Filtrar por fecha
# Commits desde una fecha específica
git log --since="2025-04-15"
# Commits hasta una fecha específica
git log --until="2025-04-30"
# Commits en un rango de fechas
git log --since="2 weeks ago" --until="yesterday"
# Formatos de fecha relativos
git log --since="1 month 2 days ago"
Filtrar por mensaje de commit
# Buscar texto en mensajes de commit
git log --grep="bug"
# Ignorar mayúsculas/minúsculas
git log --grep="feature" --ignore-case
Filtrar por contenido (pickaxe)
La opción -S
(conocida como "pickaxe") busca commits que añadan o eliminen código que coincida con un patrón:
# Buscar commits que añadan o eliminen referencias a "getUserData"
git log -S"getUserData"
# Con expresiones regulares
git log -G"get[A-Z][a-z]+Data"
Filtrar por archivo o directorio
# Commits que afectan a un archivo específico
git log -- path/to/file.js
# Commits que afectan a múltiples archivos
git log -- path/to/file1.js path/to/file2.js
# Commits que afectan a un directorio
git log -- path/to/directory/
Combinando filtros
Los filtros pueden combinarse para búsquedas más precisas:
# Commits de Juan que contienen "fix" en el mensaje en la última semana
git log --author="Juan" --grep="fix" --since="1 week ago"
# Commits que modifican auth.js y contienen "password"
git log -S"password" -- src/auth.js
Visualización personalizada de resultados
Para hacer que los resultados de búsqueda sean más útiles, puedes personalizar el formato de salida:
Formato compacto
# Formato de una línea
git log --oneline
# Formato personalizado
git log --pretty=format:"%h - %an, %ar : %s"
Donde:
%h
: Hash abreviado%an
: Nombre del autor%ar
: Fecha relativa%s
: Asunto (primera línea del mensaje)
Mostrar diferencias
# Mostrar cambios introducidos por cada commit
git log -p
# Limitar a un número específico de commits
git log -p -n 5
Mostrar estadísticas
# Estadísticas resumidas
git log --stat
# Estadísticas más detalladas
git log --numstat
Búsqueda de código con git grep
Mientras que git log
busca en el historial de commits, git grep
busca en los archivos del repositorio:
# Buscar "function login" en todos los archivos
git grep "function login"
# Buscar en una versión específica
git grep "function login" v1.2.3
# Mostrar número de línea
git grep -n "function login"
# Contar ocurrencias por archivo
git grep -c "TODO"
# Buscar solo en archivos JavaScript
git grep "function login" -- "*.js"
Identificar quién modificó cada línea con git blame
El comando git blame
muestra quién modificó cada línea de un archivo y en qué commit:
# Ver quién modificó cada línea de un archivo
git blame path/to/file.js
# Limitar a un rango de líneas
git blame -L 10,20 path/to/file.js
# Ignorar cambios de espacios en blanco
git blame -w path/to/file.js
# Mostrar el contenido del archivo en una revisión anterior
git blame v1.0 -- path/to/file.js
Búsqueda avanzada con git log
Buscar por cambios en la estructura del código
# Buscar commits que añadan o eliminen funciones que coincidan con un patrón
git log -G"function \w+\s*\("
Filtrar por merge commits
# Mostrar solo commits de merge
git log --merges
# Excluir commits de merge
git log --no-merges
Filtrar por número de archivos modificados
# Commits que modifican más de 5 archivos
git log --min-parents=1 --diff-filter=ACDMRTUXB --format="%h %an %s" --numstat | awk 'NF==3{files++} NF!=3{if(files>5){print $0}; files=0}'
Herramientas visuales para búsqueda
Las interfaces gráficas pueden facilitar la búsqueda en el historial:
- GitKraken: Ofrece búsqueda avanzada con filtros visuales
- Sourcetree: Incluye búsqueda en commits y contenido
- Visual Studio Code con GitLens: Proporciona búsqueda integrada en el editor
- GitHub/GitLab: Ofrecen búsqueda avanzada a través de la interfaz web
Casos de uso prácticos
Encontrar cuándo se introdujo un bug
# Buscar commits que modificaron una función específica
git log -p -S"functionWithBug" -- path/to/file.js
# Usar bisect para encontrar automáticamente el commit problemático
git bisect start
git bisect bad # Marca el commit actual como "malo"
git bisect good v1.0 # Marca un commit anterior como "bueno"
# Git te ayudará a encontrar el commit exacto que introdujo el problema
Rastrear cambios en una característica
# Ver la evolución de un archivo específico
git log --follow -p -- path/to/feature.js
# Ver quién ha modificado más un archivo (estadísticas de autoría)
git shortlog -sn -- path/to/feature.js
Encontrar commits relacionados con un ticket
# Buscar referencias a un número de ticket
git log --grep="#1234"
Encontrar código duplicado
# Buscar una función específica que podría estar duplicada
git grep "function calculateTotal"
Técnicas avanzadas
Usar expresiones regulares extendidas
# Habilitar expresiones regulares extendidas
git log --grep="feature|fix|docs" --extended-regexp
# o
git log --grep="feature\|fix\|docs" --basic-regexp
Buscar en ramas específicas
# Buscar solo en una rama específica
git log feature-branch --grep="API"
# Buscar commits en una rama pero no en otra
git log main..feature-branch
Combinar con comandos de shell
# Encontrar los 5 archivos con más cambios
git log --name-only --pretty=format: | sort | uniq -c | sort -nr | head -n 5
Buenas prácticas para facilitar la búsqueda
- Escribe mensajes de commit descriptivos: Facilita encontrar cambios específicos
- Usa convenciones de commit: Como "feat:", "fix:", "docs:" al inicio del mensaje
- Referencia números de tickets: Incluye "#1234" para vincular con sistemas de seguimiento
- Haz commits atómicos: Cada commit debe representar un cambio lógico único
- Documenta decisiones importantes: Incluye el "por qué" de los cambios, no solo el "qué"
Conclusión
Dominar las técnicas de búsqueda en el historial de Git te permite aprovechar al máximo la información almacenada en tu repositorio. Ya sea que estés rastreando un bug, entendiendo cómo evolucionó una característica o simplemente explorando el código, estas herramientas te ayudarán a encontrar exactamente lo que buscas de manera eficiente.
La capacidad de buscar efectivamente en el historial es una habilidad que distingue a los usuarios avanzados de Git, permitiéndoles tomar decisiones más informadas y resolver problemas más rápidamente.