Pular para o conteúdo

Jujutsu (jj) - Controle de Versão Compatível com Git

Jujutsu (jj) - Controle de Versão Compatível com Git

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

PlataformaComando
Cargocargo install --locked jj-cli
macOS (Homebrew)brew install jj
Arch Linuxsudo pacman -S jujutsu
Nixnix profile install nixpkgs#jujutsu
Windows (Scoop)scoop install jujutsu
Verificarjj --version

Configuração

ComandoDescriçã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 --colocateInicializar jj em um repositório Git existente (mantém .git)
jj git clone <url>Clonar um repositório Git com jj
jj git initCriar um novo repositório jj (backend nativo)

Conceitos Principais

TermoSignificado
ChangeUma mudança lógica com um ID de mudança estável (sobrevive rewrites)
CommitUm snapshot; a cópia de trabalho é sempre um commit (@)
@O commit da cópia de trabalho atual
RevsetUma linguagem de consulta para selecionar commits
Operation logHistórico de operações do repositório, cada uma reversível
BookmarkUm ponteiro nomeado (mapeia para um branch Git ao fazer push)

Fluxo de Trabalho Cotidiano

ComandoDescrição
jj statusMostrar mudanças da cópia de trabalho
jj logMostrar o gráfico de commits
jj diffDiff do commit da cópia de trabalho
jj describe -m "msg"Definir/substituir a mensagem do commit atual
jj newIniciar 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

ComandoDescrição
jj squashMover mudanças de @ para seu pai
jj squash -iInterativamente escolher o que fazer squash
jj splitDividir 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

ComandoDescrição
jj op logListar cada operação realizada
jj undoDesfazer 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

ComandoDescrição
jj bookmark create main -r @Criar um bookmark (≈ branch Git)
jj bookmark set main -r @Mover um bookmark para um commit
jj git fetchBuscar do repositório remoto Git
jj git pushFazer 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)

RevsetSeleciona
@Commit da cópia de trabalho
@-Pai da cópia de trabalho
mainO 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

AspectoJujutsu (jj)Git
Área de stagingNenhuma (cópia de trabalho é um commit)Index/staging
ConflitosPrimeira classe, commitáveisDeve resolver antes de prosseguir
DesfazerUniversal via op logReflog (parcial)
BranchesBookmarks (opcionais)Branches (central)
BackendCompatível com GitGit

Recursos