Capítulo 6 de 33 8 secciones 6 min

Leer la historia sin abrir un archivo

Buscar en el pasado del proyecto y saber quién escribió cada línea

La historia de un proyecto se lee con tres comandos: <code>log</code> para la lista, <code>show</code> para un momento concreto y <code>blame</code> para saber quién escribió una línea y en qué commit. Con eso entras a cualquier repositorio ajeno y entiendes qué pasó ahí sin preguntarle a nadie 🕵️

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 log y vas abriendo commits uno por uno
  • git blame sobre ese archivo
  • git 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é.

¿Tienes alguna duda o consulta?