Jujutsu (jj) é um sistema de controle de versão moderno que é compatível com Git — usa um repositório Git como backend, então você pode adotá-lo em repositórios existentes e interoperar com colegas usando Git. Seu modelo é diferente e, para muitos, mais simples: a cópia de trabalho é ela mesma um commit (sem área de staging separada), conflitos são objetos primeira classe que você pode fazer commit e resolver depois, e cada operação é registrada em um log de operações que você pode desfazer. Não há branches no sentido Git por padrão; você trabalha com mudanças identificadas por IDs de mudança estáveis.
Instalação
| 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 |
Configuração
| Comando | Descrição |
|---|
jj config set --user user.name "Your Name" | Definir seu nome |
jj config set --user user.email "you@example.com" | Definir seu email |
jj git init --colocate | Inicializar jj em um repositório Git existente (mantém .git) |
jj git clone <url> | Clonar um repositório Git com jj |
jj git init | Criar um novo repositório jj (backend nativo) |
Conceitos Principais
| Termo | Significado |
|---|
| Change | Uma mudança lógica com um ID de mudança estável (sobrevive rewrites) |
| Commit | Um snapshot; a cópia de trabalho é sempre um commit (@) |
@ | O commit da cópia de trabalho atual |
| Revset | Uma linguagem de consulta para selecionar commits |
| Operation log | Histórico de operações do repositório, cada uma reversível |
| Bookmark | Um ponteiro nomeado (mapeia para um branch Git ao fazer push) |
Fluxo de Trabalho Cotidiano
| Comando | Descrição |
|---|
jj status | Mostrar mudanças da cópia de trabalho |
jj log | Mostrar o gráfico de commits |
jj diff | Diff do commit da cópia de trabalho |
jj describe -m "msg" | Definir/substituir a mensagem do commit atual |
jj new | Iniciar uma nova mudança em cima da atual |
jj new <rev> | Iniciar uma nova mudança em cima de um commit específico |
jj edit <rev> | Fazer um commit existente ser a cópia de trabalho |
jj commit -m "msg" | Descrever @ e iniciar uma nova mudança (estilo Git) |
Movendo & Editando Histórico
| Comando | Descrição |
|---|
jj squash | Mover mudanças de @ para seu pai |
jj squash -i | Interativamente escolher o que fazer squash |
jj split | Dividir o commit atual em dois |
jj rebase -d <dest> | Fazer rebase de uma mudança em um destino |
jj abandon <rev> | Descartar um commit |
jj duplicate <rev> | Copiar um commit em outro lugar |
O Recurso Matador: Desfazer
| Comando | Descrição |
|---|
jj op log | Listar cada operação realizada |
jj undo | Desfazer a última operação |
jj op restore <id> | Restaurar o repositório para um estado de operação anterior |
Como todo comando é uma operação, quase tudo pode ser desfeito — incluindo rebases e abandons.
Bookmarks & Interoperabilidade Git
| Comando | Descrição |
|---|
jj bookmark create main -r @ | Criar um bookmark (≈ branch Git) |
jj bookmark set main -r @ | Mover um bookmark para um commit |
jj git fetch | Buscar do repositório remoto Git |
jj git push | Fazer push de bookmarks para o repositório remoto Git |
jj git push -c @ | Criar um branch remoto a partir da mudança atual |
Revsets (Selecionando Commits)
| Revset | Seleciona |
|---|
@ | Commit da cópia de trabalho |
@- | Pai da cópia de trabalho |
main | O commit para o qual um bookmark aponta |
mine() | Seus commits |
ancestors(@) | Todos os ancestrais de @ |
jj log -r "description(glob:'fix*')" | Commits cuja mensagem corresponde |
Fluxos de Trabalho Comuns
# Adoptar jj em um repositório Git existente, continuar trabalhando com remotes Git
jj git init --colocate
jj log
# Fazer uma mudança sem staging — apenas editar arquivos, depois descrever
# (arquivos são auto-capturados em @)
jj describe -m "Add feature"
jj new # iniciar a próxima mudança
# Ops — desfazer a última coisa que você fez (até mesmo um rebase)
jj undo
# Fazer push da mudança atual como um branch para revisão
jj bookmark create feature -r @
jj git push -c @
jj vs Git
| Aspecto | Jujutsu (jj) | Git |
|---|
| Área de staging | Nenhuma (cópia de trabalho é um commit) | Index/staging |
| Conflitos | Primeira classe, commitáveis | Deve resolver antes de prosseguir |
| Desfazer | Universal via op log | Reflog (parcial) |
| Branches | Bookmarks (opcionais) | Branches (central) |
| Backend | Compatível com Git | Git |
Recursos