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.
Material relacionado
Cómo mover un repositorio de Git completo
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í:
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
Tema siguiente
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.