Preparo una historia para husmear
mkdir tienda cd tienda git init -q printf 'ciudad,monto\nLima,1200\n' > ventas.csv git add ventas.csv git commit -q -m "Primeras ventas de Lima" printf 'Arequipa,890\n' >> ventas.csv git add ventas.csv git commit -q -m "Se agregan las ventas de Arequipa" printf 'bodega,ciudad\nBodega Sol,Lima\n' > clientes.csv git add clientes.csv git commit -q -m "Se agrega el catalogo de clientes" printf 'Trujillo,1450\n' >> ventas.csv git add ventas.csv git commit -q -m "Se agregan las ventas de Trujillo" git log --oneline
5ff7017 Se agregan las ventas de Trujillo e4eb86b Se agrega el catalogo de clientes 571877b Se agregan las ventas de Arequipa 54da6e2 Primeras ventas de Lima
Filtrar, que es de lo que se trata
Un proyecto real tiene miles de commits, así que el log casi nunca se lee entero. Se filtra.
Por lo que dice el mensaje:
git log --oneline --grep="ventas"
5ff7017 Se agregan las ventas de Trujillo 571877b Se agregan las ventas de Arequipa 54da6e2 Primeras ventas de Lima
Por el archivo que tocaron:
git log --oneline -- clientes.csv
e4eb86b Se agrega el catalogo de clientes
Ese guion doble separa los commits de los archivos. Sin él, Git no sabe si
clientes.csv es una rama o un archivo 📁
Y los últimos, que es lo que más se usa:
git log --oneline -2
5ff7017 Se agregan las ventas de Trujillo e4eb86b Se agrega el catalogo de clientes
Ver un momento por dentro
git show abre un commit y te enseña qué cambió en él:
git show --stat --oneline HEAD~1
e4eb86b Se agrega el catalogo de clientes clientes.csv | 2 ++ 1 file changed, 2 insertions(+)
El --stat resume; sin él te muestra las líneas una por una. Y
HEAD~1 es "uno antes del actual", que ya usamos en el capítulo
1.
Quién escribió esta línea
Este es el comando que más me sorprendió cuando lo descubrí:
git blame ventas.csv
^54da6e2 (Miss Yera 2026-01-15 09:00:00 -0500 1) ciudad,monto ^54da6e2 (Miss Yera 2026-01-15 09:00:00 -0500 2) Lima,1200 571877bb (Miss Yera 2026-01-15 09:00:00 -0500 3) Arequipa,890 5ff7017a (Miss Yera 2026-01-15 09:00:00 -0500 4) Trujillo,1450
Cada línea del archivo, con el commit del que salió y quién la escribió. Cuando entras a un proyecto que no conoces y encuentras algo raro, esto te lleva directo al momento en que se puso ahí, y al mensaje que lo explica 🔦
El error de pedir un commit que no existe
git show inventado123
fatal: ambiguous argument 'inventado123': unknown revision or path not in the working tree. Use '--' to separate paths from revisions, like this: 'git <command> [<revision>...] -- [<file>...]'
Ambiguous porque Git no sabe si le pediste un commit o un archivo, y no encontró ninguno de los dos. De ahí sale el consejo del guion doble que te da en el propio mensaje.
La trampa
Te toca revisar por qué el reporte de ventas de Lima salió mal el mes pasado. Miras el log del proyecto y ves solo tres commits en todo el mes, así que concluyes que casi nadie tocó nada.
$ git log --oneline 4f2a91c Se corrige el reporte 8c1b03e Ajustes 2d9e77a Actualizacion mensual
Qué está mal
Estás viendo una sola rama 🌳git log a secas muestra la historia de donde estás parada, no la del proyecto. Los otros cuarenta commits del mes pueden estar en ramas que todavía no se juntaron con esta, o en el servidor sin que te los hayas traído.
Se ve todo con git log --all --oneline --graph, que dibuja las ramas y no se salta ninguna.
Y hay un segundo motivo para no fiarse: si nadie se trajo lo último del servidor, tu copia está vieja aunque el log se vea completo. Eso lo arreglamos en el capítulo de GitHub.
Comprueba que se entendió
Comprueba que lo tienes
Quieres saber en qué commit se rompió una línea concreta de un archivo. ¿Con qué empiezas?
git logy vas abriendo commits uno por unogit blamesobre ese archivogit status- Abrir el archivo y buscar a ojo
Ejercicios
1. Los commits de un solo archivo
Pide la historia de ventas.csv nada más.
git log --oneline -- ventas.csv
5ff7017 Se agregan las ventas de Trujillo 571877b Se agregan las ventas de Arequipa 54da6e2 Primeras ventas de Lima
Tres de los cuatro commits tocaron ese archivo. Filtrar por archivo es lo primero que hago cuando algo falla en un sitio concreto.
2. Qué entró exactamente en el último commit
Muestra las líneas que cambiaron, no el resumen.
git show HEAD -- ventas.csv
commit 5ff7017a42f7ff951f3f95007caca474c3e95188
Author: Miss Yera <hola@missyera.com>
Date: Thu Jan 15 09:00:00 2026 -0500
Se agregan las ventas de Trujillo
diff --git a/ventas.csv b/ventas.csv
index 0c80877..2961128 100644
--- a/ventas.csv
+++ b/ventas.csv
@@ -1,3 +1,4 @@
ciudad,monto
Lima,1200
Arequipa,890
+Trujillo,1450
La línea con + es lo que entró. Así se lee un cambio sin abrir
el archivo ni compararlo con nada 👀
3. La historia con su dibujo
Pide el log con el gráfico de ramas, aunque todavía haya una sola.
git log --all --oneline --graph
* 5ff7017 Se agregan las ventas de Trujillo * e4eb86b Se agrega el catalogo de clientes * 571877b Se agregan las ventas de Arequipa * 54da6e2 Primeras ventas de Lima
Los asteriscos son los commits. Cuando aparezcan ramas en el capítulo 10, este dibujo se vuelve mucho más interesante.
4. Cuántas líneas cambió cada commit
Pide la historia con el resumen de líneas de cada uno.
git log --oneline --stat -1
5ff7017 Se agregan las ventas de Trujillo ventas.csv | 1 + 1 file changed, 1 insertion(+)
Un commit que toca veinte archivos y trescientas líneas es una señal de alarma: casi siempre son varias cosas metidas juntas.
5. Busca por lo que NO dice
Encuentra los commits cuyo mensaje no mencione ventas.
git log --oneline --invert-grep --grep="ventas"
e4eb86b Se agrega el catalogo de clientes
El --invert-grep da la vuelta al filtro. Suena raro y sirve
muchísimo para encontrar lo que se escapó de una convención.
6. Quién escribió el catálogo de clientes
Pide el blame del CSV de clientes con el formato corto.
git blame --line-porcelain clientes.csv | grep "^author " | sort -u
author Miss Yera
En un proyecto con varias personas esto te dice a quién preguntarle. En uno tuyo te dice si fue tu yo de hace un año 😄
7. Pide un archivo que no está en ese commit
Intenta ver clientes.csv en el primer commit,
cuando todavía no existía.
git show HEAD~3:clientes.csv
fatal: path 'clientes.csv' exists on disk, but not in 'HEAD~3'
El mensaje es exacto: el archivo no existe en ese momento. Y eso es información: te acabas de enterar de que se creó después.
Lo que te llevas
La historia se filtra, no se lee entera. Y blame no es para culpar, es para encontrar el porqué.