A3.1 Preguntarle al historial¶
Para quién es esto
Es material avanzado. Las sesiones son reales y los números de commit serán distintos en tu equipo.
Una tienda con historia¶
Un repositorio con ocho commits de dos personas (Ana y Luis). En el sexto, alguien cambió el precio de 10 a 100: un error que más adelante habrá que encontrar.
mkdir tienda && cd tienda
git init
echo '# Tienda' > README.md && git add README.md && git commit -m 'Crea el proyecto'
printf 'precio=10\nmoneda=EUR\n' > config.txt && git add config.txt && git commit -m 'Añade la configuración'
printf 'pan\nleche\nhuevos\n' > productos.txt && git add productos.txt && git commit -m 'Añade la lista de productos'
echo 'descuento=5' > descuentos.txt && git add descuentos.txt && git commit --author='Luis Prueba <luis@ejemplo.com>' -m 'Añade descuentos'
sed -i 's/EUR/USD/' config.txt && git commit -a --author='Luis Prueba <luis@ejemplo.com>' -m 'Cambia la moneda'
sed -i 's/precio=10/precio=100/' config.txt && git commit -am 'Ajusta el precio'
echo '--- fin ---' > pie.txt && git add pie.txt && git commit -m 'Añade el pie'
echo 'Tienda de ejemplo' >> README.md && git commit -am 'Actualiza el README'
log con filtros¶
git log admite muchos filtros. Los más útiles, con los resultados reales de este repositorio. Quién hizo qué, con un formato propio (%h el número corto, %an el autor, %s el mensaje):
$ git log --format='%h %an %s'
09b973a Ana Ejemplo Actualiza el README
8a75cbf Ana Ejemplo Añade el pie
73be57a Ana Ejemplo Ajusta el precio
d293cb8 Luis Prueba Cambia la moneda
25219e7 Luis Prueba Añade descuentos
9fa8389 Ana Ejemplo Añade la lista de productos
7b9750a Ana Ejemplo Añade la configuración
d373f4a Ana Ejemplo Crea el proyecto
Solo los commits de una persona:
$ git log --oneline --author=Luis
d293cb8 Cambia la moneda
25219e7 Añade descuentos
Solo los que tocan un archivo (se pone el archivo después de --, que separa las opciones de las rutas):
$ git log --oneline -- config.txt
73be57a Ajusta el precio
d293cb8 Cambia la moneda
7b9750a Añade la configuración
Por el texto del mensaje (--grep), sin distinguir mayúsculas (-i):
$ git log --oneline --grep='añade' -i
8a75cbf Añade el pie
25219e7 Añade descuentos
9fa8389 Añade la lista de productos
7b9750a Añade la configuración
| Quiero ver... | Opción |
|---|---|
Los últimos n commits |
git log -n 3 (o -3) |
| Los de una persona | --author=nombre |
| Los que tocan un archivo o carpeta | -- ruta |
| Los que mencionan un texto en el mensaje | --grep=texto |
| Los de un rango de fechas | --since="2025-03-01" y --until="2025-03-15" (también valen "2 weeks ago") |
| Qué archivos tocó cada uno | --stat |
| El cambio completo de cada uno | -p (o --patch) |
| El grafo de ramas | --graph --oneline --all --decorate |
| Solo las fusiones, o sin ellas | --merges / --no-merges |
¿Cuándo apareció este texto? El «pickaxe»¶
El filtro más potente y menos conocido es -S (el «pico»): muestra los commits que han cambiado el número de veces que aparece un texto, es decir, el commit que lo introdujo o lo eliminó. Responde a «¿cuándo apareció precio=100?»:
$ git log --oneline -S'precio=100'
73be57a Ajusta el precio
Y para ver qué cambió exactamente, se añade -p (y la ruta, para no ver otros archivos):
$ git log -p -S'precio=100' -- config.txt
commit 73be57a998627c60efe696c063201fce8563e7ec
Author: Ana Ejemplo <ana@ejemplo.com>
Date: Sat Mar 1 10:06:00 2025 +0000
Ajusta el precio
diff --git a/config.txt b/config.txt
index 2a31dbd..edb7a43 100644
--- a/config.txt
+++ b/config.txt
@@ -1,2 +1,2 @@
-precio=10
+precio=100
moneda=USD
Hay un hermano, -G, que en lugar de contar apariciones busca un patrón (expresión regular) en las líneas cambiadas, útil cuando buscas «cualquier línea que cambió y contiene precio»:
$ git log --oneline -G'^precio='
73be57a Ajusta el precio
7b9750a Añade la configuración
Resumir: shortlog¶
git shortlog -sn cuenta los commits de cada persona (-s = resumen, -n = de más a menos). Aquí se escribe con HEAD al final: en una terminal normal no hace falta, pero sin un commit y fuera de una terminal (en un script) shortlog se queda esperando datos por la entrada:
$ git shortlog -sn HEAD
6 Ana Ejemplo
2 Luis Prueba
Ver un commit: show¶
git show muestra un commit entero (autor, fecha, mensaje y cambios). Con --stat, solo los archivos que tocó:
$ git show --stat HEAD~2
commit 73be57a998627c60efe696c063201fce8563e7ec
Author: Ana Ejemplo <ana@ejemplo.com>
Date: Sat Mar 1 10:06:00 2025 +0000
Ajusta el precio
config.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Comparar: .. frente a ...¶
Entre dos ramas, dos puntos y tres puntos significan cosas distintas, y se confunden mucho. Se crea una rama rama desde un commit antiguo, y se le añade un commit; main ha seguido avanzando:
$ git switch -q -c rama main~3
$ echo x > nuevo.txt && git add nuevo.txt && git commit -q -m 'Trabajo en la rama'
$ git log --oneline main..rama
427f5a6 Trabajo en la rama
$ git log --oneline rama..main
09b973a Actualiza el README
8a75cbf Añade el pie
73be57a Ajusta el precio
main..rama= «los commits que están enramay no enmain»: aquí, solo el trabajo de la rama.rama..main= al revés: lo quemaintiene yramano.
Y con diff, los dos puntos comparan las puntas de las dos ramas, mientras que los tres puntos comparan la rama contra el punto donde se separó, es decir, solo lo que ha hecho la rama:
$ git switch -q -c rama main~3
$ echo x > nuevo.txt && git add nuevo.txt && git commit -q -m 'Trabajo en la rama'
$ git diff --stat main..rama
README.md | 1 -
config.txt | 2 +-
nuevo.txt | 1 +
pie.txt | 1 -
4 files changed, 2 insertions(+), 3 deletions(-)
$ git diff --stat main...rama
nuevo.txt | 1 +
1 file changed, 1 insertion(+)
Con main..rama aparecen también los cambios de main al revés (los archivos que main tiene y la rama no, como si la rama los hubiera borrado). Con main...rama solo sale nuevo.txt, lo que hizo la rama. Para revisar qué aporta una rama, casi siempre quieres tres puntos.
Errores frecuentes¶
| Error | Cómo evitarlo |
|---|---|
Olvidar -- antes de la ruta de un archivo |
Sin él, git puede confundir el archivo con una rama |
Buscar con --grep algo que está en el código |
--grep mira el mensaje; para el código es -S o -G |
Confundir .. y ... |
Dos puntos: lo que está en una y no en la otra. Tres: lo de cada lado desde el punto común (en diff, lo que hizo la rama) |
| Un historial enorme sin filtrar | Combina filtros: --author, --since, --, -S |
Para practicar¶
Los ejercicios GA3.1, GA3.2 y GA3.5 de GA3 · Ejercicios practican --author, el pickaxe y shortlog.