HDP115

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.

CE

Cristian Escalante

Última actualización: 1 de mayo de 2025

git
control de versiones
desarrollo

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:

  1. GitKraken: Ofrece búsqueda avanzada con filtros visuales
  2. Sourcetree: Incluye búsqueda en commits y contenido
  3. Visual Studio Code con GitLens: Proporciona búsqueda integrada en el editor
  4. 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

  1. Escribe mensajes de commit descriptivos: Facilita encontrar cambios específicos
  2. Usa convenciones de commit: Como "feat:", "fix:", "docs:" al inicio del mensaje
  3. Referencia números de tickets: Incluye "#1234" para vincular con sistemas de seguimiento
  4. Haz commits atómicos: Cada commit debe representar un cambio lógico único
  5. 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.

Cómo deshacer cambios en Git
Aprende las diferentes formas de deshacer cambios en Git, de...
Reflog y recuperación de commits perdidos
Aprende a utilizar git reflog para rastrear cambios en tu re...
Referencias
Git. Git - git-log Documentation. https://git-scm.com/docs/git-log
Git. Git - git-grep Documentation. https://git-scm.com/docs/git-grep
Git. Git - git-blame Documentation. https://git-scm.com/docs/git-blame
Scott Chacon and Ben Straub. Pro Git Book - Searching. https://git-scm.com/book/en/v2/Git-Tools-Searching

Conceptos Básicos de HTML

Aprende los conceptos básicos de HTML

Conceptos Básicos de CSS

Aprende los conceptos básicos de CSS

Conceptos Básicos de JavaScript

Aprende los conceptos básicos de JavaScript

Conceptos Básicos SQL

Aprende los conceptos básicos de SQL

Conceptos Básicos de Python

Aprende los conceptos básicos de Python

Conceptos Básicos de UML

Aprende los conceptos básicos de UML

Refuerzo Academico de Herramientas de Productividad 2025