Revsets: consultas sobre el historial

Por: Artiko
jujutsujjrevsetsconsultas

¿Qué son los revsets?

Los revsets son un lenguaje de expresiones para seleccionar conjuntos de commits. Son mucho más poderosos que las referencias de Git y permiten consultas complejas con una sintaxis legible.

Se usan con la flag -r en la mayoría de comandos:

jj log -r "EXPRESION"

Expresiones básicas

Referencias directas

# Working copy
jj log -r @

# Commit por change ID
jj log -r sqpuoqvx

# Raíz del repositorio
jj log -r root()

Bookmarks y tags

# Bookmark local
jj log -r main

# Bookmark remoto
jj log -r main@origin

Operadores de parentesco

# Padres de un commit
jj log -r "parents(@)"

# Hijos de un commit
jj log -r "children(main)"

# Ancestros (incluyendo el commit)
jj log -r "ancestors(@)"
jj log -r "::@"        # sintaxis corta

# Descendientes
jj log -r "descendants(main)"
jj log -r "main::"     # sintaxis corta

# Rango entre dos commits
jj log -r "main..@"

Operadores de conjunto

# Unión (commits en A O en B)
jj log -r "main | feature"

# Intersección (commits en A Y en B)
jj log -r "main & feature"

# Diferencia (commits en A pero NO en B)
jj log -r "main ~ feature"

# Negación
jj log -r "~main"

Funciones útiles

Filtrar por autor

jj log -r 'author("artiko")'

Filtrar por descripción

jj log -r 'description("fix")'

Commits con conflictos

jj log -r "conflicts()"

Commits vacíos

jj log -r "empty()"

Commits que modifican un archivo

jj log -r 'file("src/main.rs")'

Heads (commits sin hijos)

jj log -r "heads(all())"

Commits entre main y working copy

jj log -r "main..@"

Combinando expresiones

# Mis commits recientes que no están en main
jj log -r 'author("artiko") & (main..@)'

# Commits con conflictos descendientes de main
jj log -r 'conflicts() & descendants(main)'

# Todos los commits excepto los de main
jj log -r "all() ~ ::main"

Uso práctico con comandos

Los revsets funcionan en cualquier comando que acepte -r:

# Rebase de todos mis commits sobre main
jj rebase -s 'roots(author("artiko") & main..)' -d main

# Abandonar commits vacíos
jj abandon 'empty() & mine()'

# Ver diff de todos los commits de una feature
jj diff -r 'main..@'

Revsets más usados

RevsetDescripción
@Working copy
@-Padre del working copy
main..@Commits entre main y aquí
ancestors(@)Todos los ancestros
conflicts()Commits con conflictos
empty()Commits sin cambios
mine()Mis commits
heads(all())Puntas de todas las ramas

Los revsets son una de las características más poderosas de jj. Dominarlos te permite manipular el historial con precisión quirúrgica.