Introducción
git log recorre el grafo de commits desde un punto de partida (predeterminado: HEAD) hacia atrás a través de los padres, mostrando cada commit. Es la herramienta principal para explorar el historial del proyecto.
Uso básico
git log
git log --oneline
git log --oneline --graph --decorate --all
La última forma es la vista navaja suiza: un grafo compacto de cada branch con refs decoradas.
Filtrando por fecha, autor, mensaje
git log --since="2 weeks ago"
git log --until=2025-01-01
git log --author="Ada"
git log --grep="bugfix"
git log -S "deprecated_function" # pickaxe: ¿cuándo apareció una cadena?
-S es invaluable para arqueología: encuentra commits que cambian el número de ocurrencias de una cadena en cualquier archivo.
Mostrando diffs
git log -p # patch completo por commit
git log --stat # archivos cambiados más conteos +/-
git log --shortstat # solo línea de resumen
git log -p -- path/to/file # solo commits que tocan una ruta
Formatos personalizados
--pretty=format: acepta marcadores. Una línea útil:
git log --pretty=format:"%h %an %ad %s" --date=short
%h hash abreviado, %an nombre del autor, %ad fecha del autor, %s asunto. Mira git help log para la lista completa.
Límites y rangos
git log -n 5 # últimos 5 commits
git log main..feature # commits en feature que no están en main
git log main...feature # diferencia simétrica
git log feature ^main # equivalente a main..feature
Siguiendo renombres de archivos
Git no registra renombres, los detecta. Para seguir el historial a través de un renombre:
git log --follow -- path/to/file
Alias útiles
Un puñado de alias de git log se pagan solos en la primera semana. Dos especialmente buenos:
git config --global alias.lg "log --oneline --graph --decorate --all"
git config --global alias.last "log -1 HEAD --stat"
git config --global alias.recent "log --since='2 weeks ago' --author=$(git config user.email)"
git lg da el grafo a vista de pájaro; git last muestra lo que acaba de pasar; git recent responde "¿en qué he trabajado últimamente?". Añade un alias para cualquier invocación de log que escribas más de dos veces.
Inverso y limitado
Por defecto git log recorre del más nuevo al más antiguo. A veces (notas de versión, arqueología de código) quieres lo opuesto, emparejado con un formato limpio:
git log --reverse --oneline v1.0.0..v1.1.0
git log --reverse --pretty=format:"* %s (%h)" v1.0.0..HEAD > CHANGELOG.draft
Aquí también es donde pickaxe y los filtros de ruta se ganan su sueldo: git log --reverse -S "old_api" -- src/ muestra el historial cronológico de la aparición y desaparición de una cadena, perfecto para rastrear deprecaciones.
Errores comunes
Leer solo el historial de HEAD y perderse commits en otros branches; pasa --all para verlos. Confundir --author (un regex sobre el campo de autor) con una coincidencia literal exacta; entrecomilla el patrón con cuidado. Usar git log file en lugar de git log -- file: el separador -- distingue rutas de refs, especialmente si un branch y un archivo comparten nombre. Finalmente, esperar que git log muestre commits eliminados después de un force-reset; usa git reflog para eso. git log solo recorre historial alcanzable.