Revsets: consultas sobre el historial
¿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
| Revset | Descripció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.