Jujutsu (jj) - Control de Versiones Compatible con Git
Jujutsu (jj) es un sistema de control de versiones moderno que es compatible con Git — utiliza un repositorio Git como backend, por lo que puedes adoptarlo en repositorios existentes e interoperar con compañeros que usan Git. Su modelo es diferente y, para muchos, más simple: la copia de trabajo es en sí misma un commit (sin área de staging separada), los conflictos son objetos de primera clase que puedes confirmar y resolver más tarde, y cada operación se registra en un registro de operaciones que puedes deshacer. No hay ramas en el sentido de Git por defecto; trabajas con cambios identificados por IDs de cambio estables.
Instalación
| Plataforma | Comando |
|---|
| Cargo | cargo install --locked jj-cli |
| macOS (Homebrew) | brew install jj |
| Arch Linux | sudo pacman -S jujutsu |
| Nix | nix profile install nixpkgs#jujutsu |
| Windows (Scoop) | scoop install jujutsu |
| Verificar | jj --version |
Configuración
| Comando | Descripción |
|---|
jj config set --user user.name "Your Name" | Establecer tu nombre |
jj config set --user user.email "you@example.com" | Establecer tu correo |
jj git init --colocate | Inicializar jj en un repositorio Git existente (mantiene .git) |
jj git clone <url> | Clonar un repositorio Git con jj |
jj git init | Crear un nuevo repositorio jj (backend nativo) |
Conceptos Fundamentales
| Término | Significado |
|---|
| Change | Un cambio lógico con un ID de cambio estable (sobrevive reescrituras) |
| Commit | Una captura de pantalla; la copia de trabajo siempre es un commit (@) |
@ | El commit de copia de trabajo actual |
| Revset | Un lenguaje de consulta para seleccionar commits |
| Operation log | Historial de operaciones del repositorio, cada una reversible |
| Bookmark | Un puntero con nombre (se asigna a una rama Git al hacer push) |
Flujo de Trabajo Cotidiano
| Comando | Descripción |
|---|
jj status | Mostrar cambios de copia de trabajo |
jj log | Mostrar el gráfico de commits |
jj diff | Diferencia del commit de copia de trabajo |
jj describe -m "msg" | Establecer/reemplazar el mensaje del commit actual |
jj new | Iniciar un nuevo cambio encima del actual |
jj new <rev> | Iniciar un nuevo cambio encima de un commit específico |
jj edit <rev> | Convertir un commit existente en la copia de trabajo |
jj commit -m "msg" | Describir @ e iniciar un nuevo cambio (estilo Git) |
Movimiento y Edición del Historial
| Comando | Descripción |
|---|
jj squash | Mover cambios de @ a su padre |
jj squash -i | Elegir interactivamente qué comprimir |
jj split | Dividir el commit actual en dos |
jj rebase -d <dest> | Hacer rebase de un cambio a un destino |
jj abandon <rev> | Descartar un commit |
jj duplicate <rev> | Copiar un commit a otro lugar |
La Característica Asesina: Deshacer
| Comando | Descripción |
|---|
jj op log | Listar cada operación realizada |
jj undo | Deshacer la última operación |
jj op restore <id> | Restaurar el repositorio a un estado de operación anterior |
Dado que cada comando es una operación, casi cualquier cosa puede deshacerse — incluyendo rebases y descartes.
Bookmarks e Interoperabilidad con Git
| Comando | Descripción |
|---|
jj bookmark create main -r @ | Crear un bookmark (≈ rama Git) |
jj bookmark set main -r @ | Mover un bookmark a un commit |
jj git fetch | Traer desde el repositorio remoto Git |
jj git push | Empujar bookmarks al repositorio remoto Git |
jj git push -c @ | Crear una rama remota a partir del cambio actual |
Revsets (Seleccionando Commits)
| Revset | Selecciona |
|---|
@ | Commit de copia de trabajo |
@- | Padre de la copia de trabajo |
main | El commit al que apunta un bookmark |
mine() | Tus commits |
ancestors(@) | Todos los ancestros de @ |
jj log -r "description(glob:'fix*')" | Commits cuyo mensaje coincide |
Flujos de Trabajo Comunes
# Adoptar jj en un repositorio Git existente, seguir trabajando con remotos Git
jj git init --colocate
jj log
# Hacer un cambio sin staging — simplemente editar archivos, luego describir
# (los archivos se capturan automáticamente en @)
jj describe -m "Add feature"
jj new # iniciar el siguiente cambio
# Oops — deshacer lo último que hiciste (incluso un rebase)
jj undo
# Empujar el cambio actual como una rama para revisión
jj bookmark create feature -r @
jj git push -c @
jj vs Git
| Aspecto | Jujutsu (jj) | Git |
|---|
| Área de staging | Ninguna (la copia de trabajo es un commit) | Index/staging |
| Conflictos | De primera clase, pueden confirmarse | Deben resolverse antes de continuar |
| Deshacer | Universal vía op log | Reflog (parcial) |
| Ramas | Bookmarks (opcional) | Ramas (central) |
| Backend | Compatible con Git | Git |
Recursos