Guía Forense de Trazabilidad en Git

¿Por Qué Ser un Detective de Código?

Un historial de Git no es solo un backup, es el diario de vida de tu proyecto. Contiene cada decisión, cada cambio y cada error. La trazabilidad es la habilidad de navegar este diario para responder preguntas cruciales:

  • Auditoría: ¿Quién y cuándo implementó un requerimiento específico?
  • Depuración (Debugging): ¿Qué cambio exacto introdujo este bug que nos está volviendo locos?
  • Comprensión: ¿Por qué se escribió este código de esta manera tan particular?

Dominar estas herramientas te transforma de un simple "guardador" de código a un verdadero arquitecto y guardián del proyecto.

Herramienta #1: `git log` - La Bitácora del Proyecto

Es tu ventana al pasado. El comando `git log` te muestra el historial de commits, pero su verdadero poder reside en sus opciones para filtrar y formatear la salida.

Recetas para un `log` Útil

# La vista estándar: completa pero verbosa. git log # Vista compacta: un commit por línea. Ideal para una visión general. git log --oneline > a1b2c3d (HEAD -> develop) feat: Add user authentication > e4f5g6h (origin/main, main) fix: Correct report PDF generation > i7j8k9l Merge pull request #42 from icfes/feature/new-charts # La vista gráfica: muestra las ramas y fusiones. ¡Esencial! git log --graph --oneline --decorate > * a1b2c3d (HEAD -> develop) feat: Add user authentication > |\ > | * i7j8k9l Merge pull request #42 from icfes/feature/new-charts > | |\ > | | * l2m3n4o (origin/feature/new-charts) feat: Implement Plotly charts > | |/ > |/| > * | e4f5g6h (origin/main, main) fix: Correct report PDF generation # Filtrando el historial: encuentra exactamente lo que buscas. git log --author="Carlos" # Commits de un autor específico. git log --since="2 weeks ago" # Commits de las últimas 2 semanas. git log -- R/utils.R # Commits que afectaron a un archivo específico. git log -S "nombre_de_funcion" # Commits que añadieron o quitaron la palabra "nombre_de_funcion".

Herramienta #2: `git blame` - El Análisis de Huellas Digitales

Cuando te encuentras una línea de código misteriosa y te preguntas "¿Quién escribió esto y por qué?", `git blame` es tu lupa. Te muestra, línea por línea, quién fue la última persona en modificarla y en qué commit lo hizo.

Caso de Estudio: Una Constante Mágica

Imaginas que en el archivo `config.R` encuentras la línea `MAX_USERS <- 15` y no tienes idea de por qué el límite es 15. Es hora de investigar.

# Ejecutas blame sobre el archivo para encontrar al "culpable". git blame config.R > ... > ^a9d8c7b (Carlos Perez 2025-09-15 10:30:15 -0500 12) MAX_USERS <- 15 > e4f5g6h (Ana Garcia 2025-08-01 14:00:00 -0500 13) TIMEOUT_MS <- 5000 > ...

Análisis de la Evidencia: La línea 12 fue modificada por última vez por "Carlos Perez" en el commit `^a9d8c7b`. El `^` indica que fue la primera vez que esa línea apareció en ese commit.

Ahora que tienes el commit, puedes ver el contexto completo del cambio.

# Usa `git show` para ver el commit completo y su mensaje. git show a9d8c7b > commit a9d8c7b1e2f3g4h5i6j7k8l9m0n1o2p3q4r5s6t > Author: Carlos Perez > Date: Thu Sep 15 10:30:15 2025 -0500 > > perf: Limit concurrent users to 15 > > Based on performance tests from yesterday, the server becomes unstable > with more than 15 concurrent users. This limit is temporary until > the infrastructure is upgraded next quarter.

Caso Cerrado: El mensaje del commit lo explica todo. Fue una medida temporal por rendimiento. ¡Misterio resuelto!

Herramienta #3: `git bisect` - El Cazador de Bugs Binario

Esta es tu arma secreta. Cuando un bug aparece y solo sabes que "hace una semana funcionaba", `git bisect` automatiza la búsqueda del commit exacto que lo introdujo. Funciona como un juego de "frío o caliente", dividiendo el historial por la mitad en cada paso.

El Flujo de la Cacería

Commit Bueno Commit Malo Test Si es MALO Si es BUENO

Misión: Encontrar el Origen de un Gráfico Roto

# 1. Iniciar la sesión de 'bisect'. git bisect start # 2. Marcar el commit actual (donde el gráfico está roto) como 'malo'. git bisect bad # 3. Marcar un commit antiguo donde recuerdas que funcionaba como 'bueno'. # Puedes usar un hash o una etiqueta (tag). git bisect good v1.2.0 > Bisecting: 67 revisions left to test after this (roughly 6 steps) > [a1b2c3d...] feat: Refactor data processing logic # 4. Git te ha movido a un commit intermedio. Ahora, refresca tu app y prueba el gráfico. # CASO A: El gráfico sigue roto. Le dices a Git que este commit también es 'malo'. git bisect bad # CASO B: El gráfico funciona. Le dices a Git que este commit es 'bueno'. git bisect good # 5. Repite el paso 4. Git continuará dividiendo el rango de búsqueda. # Después de unos pocos pasos, Git te dará la respuesta: > a1b2c3d... is the first bad commit > ... (muestra los detalles del commit culpable) # 6. ¡Misión cumplida! Ahora sal del modo 'bisect' para volver a tu rama original. git bisect reset

Buenas Prácticas: Dejar un Rastro Limpio

Las herramientas son poderosas, pero su efectividad depende de la calidad del historial. Un historial limpio es un regalo para tu futuro yo y para tus compañeros.

Escribe Mensajes de Commit Significativos

Un mensaje como "arreglos" no ayuda a nadie. Sigue un estándar como Conventional Commits para que tus mensajes sean predecibles y claros.

feat(auth): Implementar login con roles de usuario

- Se añade la lógica del servidor para verificar roles (admin, user).
- La UI ahora redirige al usuario a su dashboard correspondiente.
- Cierra el ticket JIRA-123.
Volver al Módulo 10