Close

Git log avanzado

El propósito de todo sistema de control de versiones es registrar los cambios hechos en el código. Esto permite volver al historial del proyecto para ver quiénes son los autores, averiguar dónde se introdujeron los errores y revertir los cambios problemáticos. Pero tener todo este historial no sirve de nada si no sabes cómo navegar por él. Ahí es donde entra en juego el comando git log.

A estas alturas, ya deberías conocer el comando git log básico para mostrar confirmaciones. Sin embargo, puedes modificar la salida pasando muchos parámetros diferentes a git log.

Las funciones avanzadas de git log se pueden dividir en dos categorías: dar formato a la salida de las confirmaciones y filtrar qué confirmaciones se incluyen en la salida. En conjunto, estas dos habilidades te permiten volver a tu proyecto y encontrar cualquier información que puedas necesitar.


Formato de la salida del registro


En primer lugar, este artículo analizará las diferentes formas en las que se puede formatear la salida de git log. La mayoría vienen en forma de marcas que permiten solicitar más o menos información de git log.

Si no te gusta el formato git log predeterminado, puedes usar la funcionalidad de alias de git config para crear un acceso directo para cualquiera de las opciones de formato que se explican a continuación. Consulta El comando git config para obtener información sobre cómo configurar un alias.

Oneline

La marca --oneline comprime todas las confirmaciones en una sola línea. De forma predeterminada, solo muestra el ID de confirmación y la primera línea del mensaje de confirmación. La salida típica de git log --oneline será así:

0e25143 Merge branch 'feature'
ad8621a Fix a bug in the feature
16b36c6 Add a new feature
23ad9ad Add the initial code base

Es muy práctico para obtener una visión general de alto nivel de tu proyecto.

bases de datos
Material relacionado

Cómo mover un repositorio de Git completo

Logotipo de Bitbucket
VER LA SOLUCIÓN

Aprende a usar Git con Bitbucket Cloud

Decorate

Muchas veces viene bien saber con qué rama o etiqueta están asociadas las confirmaciones. La marca --decorate hace que git log muestre todas las referencias (por ejemplo, ramas, etiquetas, etc.) que apuntan a cada confirmación.

Esto se puede combinar con otras opciones de configuración. Por ejemplo, al ejecutar git log --oneline -- decorate el historial de confirmaciones tendrá este formato:

0e25143 (HEAD, main) Merge branch 'feature'
ad8621a (feature) Fix a bug in the feature
16b36c6 Add a new feature
23ad9ad (tag: v0.9) Add the initial code base

Así puedes saber que la confirmación superior también está extraída con checkout (lo indica HEAD) y que también es la punta de la rama main. Otra rama llamada feature apunta a la segunda confirmación; finalmente, la cuarta confirmación tiene la etiqueta v0.9.

Las ramas, etiquetas, HEAD y el historial de confirmaciones son casi toda la información contenida en tu repositorio de Git, por lo que esto te da una visión más completa de la estructura lógica del repositorio.

Diferencias

El comando git log incluye muchas opciones para mostrar diferencias con cada confirmación. Dos de las opciones más comunes son --stat y -p.

La opción --stat muestra el número de inserciones y eliminaciones de cada archivo que modifica cada confirmación (ten en cuenta que la modificación de una línea se representa como 1 inserción y 1 eliminación). Es práctico si quieres ver un resumen breve de los cambios introducidos por cada confirmación. Por ejemplo, la siguiente confirmación agregó 67 líneas al archivo hello.py y eliminó 38 líneas:

commit f2a238924e89ca1d4947662928218a06d39068c3
Author: John <john@example.com>
Date:   Fri Jun 25 17:30:28 2014 -0500

    Add a new feature

 hello.py | 105 ++++++++++++++++++++++++-----------------
 1 file changed, 67 insertion(+), 38 deletions(-)

La cantidad de signos + y - junto al nombre del archivo indica el número relativo de cambios en cada archivo que modifica la confirmación. Esto te da una idea de dónde se encuentran los cambios para cada confirmación.

Si quieres ver los cambios reales introducidos por cada confirmación, puedes pasar la opción -p a git log. Esto genera el parche completo que representa esa confirmación:

commit 16b36c697eb2d24302f89aa22d9170dfe609855b
Author: Mary <mary@example.com>
Date:   Fri Jun 25 17:31:57 2014 -0500

    Fix a bug in the feature

diff --git a/hello.py b/hello.py
index 18ca709..c673b40 100644
--- a/hello.py
+++ b/hello.py
@@ -13,14 +13,14 @@ B
-print("Hello, World!")
+print("Hello, Git!")

Para las confirmaciones con muchos cambios, la salida resultante puede ser bastante larga y difícil de manejar. La mayoría de las veces, si visualizas un parche completo, probablemente estés buscando un cambio específico. Para esto te vendrá bien la opción pickaxe.

El shortlog

El comando git shortlog es una versión especial de git log destinada a crear anuncios de publicación. Agrupa todas las confirmaciones por autor y muestra la primera línea de cada mensaje de confirmación. Es una manera fácil de ver quién ha estado trabajando en qué.

Por ejemplo, si dos desarrolladores han contribuido con 5 confirmaciones a un proyecto, el resultado de git shortlog podría ser este:

Mary (2):
      Fix a bug in the feature
      Fix a serious security hole in our framework

John (3):
      Add the initial code base
      Add a new feature
      Merge branch 'feature'

De forma predeterminada, git shortlog ordena la salida por nombre de autor, pero también puedes pasar la opción -n para ordenar por el número de confirmaciones por autor.

gráficos

La opción --graph dibuja un gráfico ASCII que representa la estructura de ramas del historial de confirmaciones. Suele utilizarse junto con los comandos --oneline y --decorate para que sea más fácil ver qué confirmación pertenece a qué rama:

git log --graph --oneline --decorate

En un repositorio simple con solo 2 ramas, este sería el resultado:

*   0e25143 (HEAD, main) Merge branch 'feature'
|\  
| * 16b36c6 Fix a bug in the new feature
| * 23ad9ad Start a new feature
* | ad8621a Fix a critical security issue
|/  
* 400e4b7 Fix typos in the documentation
* 160e224 Add the initial code base

El asterisco muestra en qué rama estaba la confirmación, por lo que el gráfico anterior nos dice que las confirmaciones 23ad9ad y 16b36c6 están en una rama temática y el resto en la rama main.

Aunque es una buena opción para repositorios simples, probablemente trabajes mejor con una herramienta de visualización más completa como gitk o Sourcetree para proyectos muy ramificados.

Formato personalizado

Para las demás necesidades de formato de git log, puedes usar la opción --pretty=format:"". Con ella puedes mostrar las confirmaciones como quieras mediante marcadores de posición de estilo printf.

Por ejemplo, los caracteres %cn, %h y %cd del siguiente comando se sustituyen por el nombre del confirmador, el hash de confirmación abreviado y la fecha del confirmador, respectivamente.

git log --pretty=format:"%cn committed %h on %cd"

Esto da el siguiente formato a cada confirmación:

John committed 400e4b7 on Fri Jun 24 12:30:04 2014 -0500 John committed 89ab2cf on Thu Jun 23 17:09:42 2014 -0500 Mary committed 180e223 on Wed Jun 22 17:21:19 2014 -0500 John committed f12ca28 on Wed Jun 22 13:50:31 2014 -0500

La lista completa de marcadores de posición se puede encontrar en el apartado de Formatos pretty de la página del manual de git log.

Además de permitirte ver solo la información que te interesa, la opción --pretty=format:"" es especialmente útil si quieres canalizar la salida de git log a otro comando.

Filtrado del historial de confirmaciones


Dar formato a la presentación de cada confirmación es solo la mitad del camino para aprender a usar git log. También hay que saber navegar por el historial de confirmaciones. El resto de este artículo presenta algunas de las formas avanzadas de seleccionar confirmaciones específicas en el historial del proyecto mediante git log. Todas ellas se pueden combinar con cualquiera de las opciones de formato de las que hemos hablado.

Por cantidad

El filtro más básico para git log es limitar el número de confirmaciones que se muestran. Si solo te interesan las últimas confirmaciones, esto te ahorra la molestia de ver todas las confirmaciones en una página.

Para limitar la salida de git log, incluye la opción -. Por ejemplo, el siguiente comando mostrará solo las 3 confirmaciones más recientes.

git log -3

Por fecha

Si buscas una confirmación de un período de tiempo específico, puedes usar las marcas --after o --before para filtrar las confirmaciones por fecha. Ambas opciones aceptan diferentes formatos de fecha como parámetro. Por ejemplo, el siguiente comando solo muestra las confirmaciones que se crearon después del 1 de julio de 2014 (inclusive):

git log --after="2014-7-1"

También puedes pasar referencias relativas como "1 week ago" (hace una semana) y "yesterday" (ayer):

git log --after="yesterday"

Para buscar confirmaciones que se crearon entre dos fechas, puedes dar una fecha --before y otra --after. Por ejemplo, para mostrar todas las confirmaciones añadidas entre el 1 de julio de 2014 y el 4 de julio de 2014, utilizarías lo siguiente:

git log --after="2014-7-1" --before="2014-7-4"

Para las confirmaciones con muchos cambios, la salida resultante puede ser bastante larga y difícil de manejar. La mayoría de las veces, si visualizas un parche completo, probablemente estés buscando un cambio específico. Para esto te vendrá bien la opción pickaxe.

Por autor

Si solo buscas confirmaciones creadas por un usuario en particular, usa la marca --author. Esto acepta una expresión regular y devuelve todas las confirmaciones cuyo autor coincide con ese patrón. Si sabes exactamente a quién buscas, puedes usar una cadena simple "de toda la vida" en lugar de una expresión regular:

git log --author="John"

Esto muestra todas las confirmaciones cuyo autor incluya el nombre John. No es necesario que el nombre del autor coincida exactamente, solo debe contener la frase especificada.

También puedes usar expresiones regulares para crear búsquedas más complejas. Por ejemplo, el siguiente comando busca las confirmaciones de Mary o John.

git log --author="John\|Mary"

Ten en cuenta que el correo electrónico del autor también se incluye con el nombre del autor, por lo que también puedes usar esta opción para buscar por correo electrónico.

Si tu flujo de trabajo separa a los confirmadores de los autores, la marca --committer funciona de la misma manera.

Por mensaje

Para filtrar las confirmaciones por su mensaje de confirmación, usa la marca --grep. Funciona igual que la marca --author de la que ya he hablado, pero coincide con el mensaje de confirmación en lugar del autor.

Por ejemplo, si tu equipo incluye números de incidencia relevantes en cada mensaje de confirmación, puedes usar algo como lo siguiente para incorporar todas las confirmaciones relacionadas con esa incidencia:

git log --grep="JRA-224:"

También puedes pasar el parámetro -i a git log para que ignore las diferencias entre mayúsculas y minúsculas en la coincidencia de patrones.

Por archivo

Muchas veces, solo te interesarán los cambios que se han hecho en un archivo en particular. Para mostrar el historial relacionado con un archivo, solo necesitas pasar la ruta del archivo. Por ejemplo, lo siguiente devuelve todas las confirmaciones que afectaron al archivo foo.py o bar.py:

git log -- foo.py bar.py

El parámetro -- se usa para indicar a git log que los argumentos que le siguen son rutas de archivo y no nombres de rama. Si no hay posibilidad de confundirlo con una rama, puedes omitir el --.

Por contenido

También es posible buscar confirmaciones que introduzcan o eliminen una línea de código fuente en particular. Esto se llama pickaxe y tiene la forma -S"". Por ejemplo, si quieres saber cuándo se añadió la cadena Hello, World! a un archivo del proyecto, usarías este comando:

git log -S"Hello, World!"

Si quieres buscar mediante una expresión regular en lugar de una cadena, puedes usar la marca -G"" en su lugar.

Es una herramienta de depuración muy eficaz, ya que permite localizar todas las confirmaciones que afectan a una línea de código en particular. Incluso puede mostrar cuándo se copió o movió una línea a otro archivo.

Por rango

Puedes pasar un rango de confirmaciones a git log para mostrar únicamente las confirmaciones contenidas en ese rango. El rango se especifica en el siguiente formato, donde y son referencias de confirmación:

git log ..

Este comando es particularmente útil cuando se utilizan referencias a ramas como parámetros. Es una forma sencilla de mostrar las diferencias entre 2 ramas. Piensa en este comando:

git log main..feature

El rango main..feature contiene todas las confirmaciones que están en la rama feature, pero que no están en la rama main. En otras palabras, indica cuánto ha progresado feature desde que se bifurcó de main. Puedes imaginarlo así:

Detectar una bifurcación en el historial mediante rangos

Ten en cuenta que, si cambias el orden del rango (feature..main), obtendrás todas las confirmaciones en main, pero no las de feature. Si git log genera confirmaciones para ambas versiones, esto te indica que el historial ha divergido.

Filtrar confirmaciones de fusión

De forma predeterminada, git log incluye confirmaciones de fusión en la salida. Pero, si tu equipo tiene una política de fusión constante (es decir, los cambios de nivel superior se fusionan en ramas temáticas en lugar de hacer un rebase de la rama temática en la rama de nivel superior), tendrás muchas confirmaciones de fusión irrelevantes en el historial de tu proyecto.

Para evitar que git log muestre estas confirmaciones de fusión, pasa la marca --no-merges:

git log --no-merges

Por otro lado, si solo te interesan las confirmaciones de fusión, puedes usar la marca --merges:

git log --merges

Esto devuelve todas las confirmaciones que tienen al menos dos principales.

Resumen


Llegados aquí, deberías estar bastante familiarizado con los parámetros avanzados de git log que sirven para formatear la salida y seleccionar qué confirmaciones quieres mostrar. De esta forma, puedes incorporar exactamente lo que necesitas del historial de tu proyecto.

Estas nuevas habilidades son una parte importante de tu kit de herramientas de Git, pero recuerda que git log se usa a menudo junto con otros comandos de Git. Una vez que hayas encontrado la confirmación que buscas, normalmente la pasarás a git checkout, git revert o alguna otra herramienta para manipular el historial de confirmaciones. Por tanto, es importante que sigas aprendiendo sobre las funciones avanzadas de Git.


Compartir este artículo

Lecturas recomendadas

Consulta estos recursos para conocer los tipos de equipos de DevOps o para estar al tanto de las novedades sobre DevOps en Atlassian.

Gente que colabora utilizando un muro lleno de herramientas

Blog de Bitbucket

Ilustración de Devops

Ruta de aprendizaje de DevOps

Demostraciones de funciones con expertos de Atlassian del Centro de demostraciones

Cómo funciona Bitbucket Cloud con Atlassian Open DevOps

Suscríbete para recibir el boletín de DevOps

Thank you for signing up