O que é o difftastic?
O difftastic — o comando é difft — é uma ferramenta de diff estrutural. Em vez de comparar linhas, ele analisa os dois arquivos com tree-sitter, monta uma árvore de sintaxe para cada lado e informa quais trechos de sintaxe realmente mudaram. Reindentar um bloco, requebrar uma lista de argumentos ou mover uma chave deixa de ser mudança, enquanto uma variável renomeada em meio a código reformatado salta aos olhos.
⚡ Principais recursos do difftastic
🌳 Diffs que entendem sintaxe
Os dois lados são transformados em árvores de sintaxe e comparados como estrutura: o ruído de formatação desaparece e as mudanças reais aparecem.
🧩 Mais de 30 linguagens
Rust, Python, TypeScript, Go, C, C++, Java, Ruby, YAML, JSON, HTML, CSS, Markdown e muitas outras — difft --list-languages mostra a lista completa com as extensões.
🪟 Lado a lado ou em linha
--display escolhe side-by-side, side-by-side-show-both, inline ou JSON legível por máquina.
🔗 Substituto direto no Git
Funciona como comando de diff externo do git e igualmente bem no Mercurial, Jujutsu e Fossil.
🚦 Recuo honesto
Extensão desconhecida, arquivo enorme ou erros de parsing em excesso: ele recua para um diff por linhas com destaque por palavras, em vez de falhar.
🗂️ Diretórios e conflitos
Compare dois diretórios num comando, ou entregue um arquivo cheio de marcadores de conflito de merge e leia o conflito como um diff.
apt upgrade mantém você na versão mais recente.
📦 Instalação a partir do deb.griffo.io
Passo 1: Adicionar o repositório
sudo install -d -m 0755 /etc/apt/keyrings
curl -fsSL https://deb.griffo.io/EA0F721D231FDD3A0A17B9AC7808B4DD62C41256.asc | sudo gpg --dearmor --yes -o /etc/apt/keyrings/deb.griffo.io.gpg
echo "deb [signed-by=/etc/apt/keyrings/deb.griffo.io.gpg] https://deb.griffo.io/apt $(lsb_release -sc 2>/dev/null) main" | sudo tee /etc/apt/sources.list.d/deb.griffo.io.list > /dev/null
sudo apt updateinstall -d -m 0755 /etc/apt/keyrings
curl -fsSL https://deb.griffo.io/EA0F721D231FDD3A0A17B9AC7808B4DD62C41256.asc | gpg --dearmor --yes -o /etc/apt/keyrings/deb.griffo.io.gpg
echo "deb [signed-by=/etc/apt/keyrings/deb.griffo.io.gpg] https://deb.griffo.io/apt $(lsb_release -sc 2>/dev/null) main" | tee /etc/apt/sources.list.d/deb.griffo.io.list > /dev/null
apt updatesudo apt install extrepo
sudo extrepo enable griffo
sudo apt update🆓 Existe um espelho grátis para sempre. deb-free.griffo.io distribui pacotes grátis para sempre — sem conta, sem assinatura, no máximo 2 meses atrás do upstream, correções de segurança imediatas. Hoje ele traz cliamp, Ghostty, lazydocker, Oh My Posh e Zed; difftastic não está entre elas, então o repositório acima é a única forma de instalar hoje — peça e ela pode ser adicionada.
🧩 Sobre a opção extrepo. extrepo é a ferramenta do próprio Debian para repositórios externos: ela escreve o arquivo de sources e instala a chave de assinatura para você, conferindo a chave contra metadados assinados antes de usá-la. Este repositório está registrado nela como griffo, e o espelho gratuito para sempre como griffo-free, então no Debian (bookworm, trixie, forky e sid) os comandos acima são toda a configuração.
O extrepo configura apenas o arquivo de sources e a chave: as credenciais de uma assinatura continuam indo em /etc/apt/auth.conf.d/deb.griffo.io.conf. O Ubuntu não é coberto, porque o extrepo publica metadados só para as suítes do Debian: lá, use os comandos com sudo ou como root.
Passo 2: Instalar o difftastic
# Instalar o difftastic mais recente
sudo apt install difftastic
# Verificar a instalação
difft --version# Instalar o difftastic mais recente
apt install difftastic
# Verificar a instalação
difft --versionPasso 3: Integrar ao git
# Comparar dois arquivos diretamente
difft old.py new.py
# Ou deixar o git chamar o difftastic em todo diff
git config --global diff.external difft
# O git diff comum continua a uma opção de distância
git --no-ext-diff diff
# A página de manual vem no pacote
man difft🎯 Exemplos básicos de uso
Comparando arquivos e diretórios:
# Dois arquivos, lado a lado
difft before.rs after.rs
# Uma única coluna, mais perto do diff tradicional
difft --display inline before.ts after.ts
# Dois diretórios, pulando os arquivos que não mudaram
difft old/ new/ --skip-unchanged --sort-paths
# Quais linguagens esta build entende?
difft --list-languagesUsando como diff do git:
# Pontual: difftastic só neste diff
GIT_EXTERNAL_DIFF=difft git diff
# Diffs estruturais por todo o histórico
GIT_EXTERNAL_DIFF=difft git log -p --ext-diff
# Registrar como difftool
git config --global difftool.difftastic.cmd 'difft "$LOCAL" "$REMOTE"'
git difftool --tool difftastic
# Um alias do git para um log estrutural
git config --global alias.dlog '!GIT_EXTERNAL_DIFF=difft git log -p --ext-diff'Ajustando a saída:
# Ignorar mudanças que só tocam comentários
difft --ignore-comments a.go b.go
# Mais contexto, e tabulações valendo dois espaços
difft --context 5 --tab-width 2 a.py b.py
# Para scripts: houve alguma mudança sintática?
difft --check-only --exit-code a.json b.json
# Padrões para toda invocação, vindos do ambiente
export DFT_DISPLAY=inline DFT_BACKGROUND=light🔧 Integrações com outras ferramentas
o difftastic se encaixa nas ferramentas que já mostram diffs para você:
- git:
GIT_EXTERNAL_DIFF,diff.externalou uma entradadifftool— com--ext-diffisso vale também paragit log -pegit show - Jujutsu: defina-o como comando de diff no
jje tenha diffs estruturais em um fluxo compatível com Git - Mercurial e Fossil: os dois aceitam um comando de diff externo, então o mesmo binário serve todos os seus repositórios
- Variáveis de ambiente:
DFT_DISPLAY,DFT_BACKGROUND,DFT_WIDTHe companhia definem seus padrões de uma vez - CI e scripts:
--check-onlycom--exit-coderesponde "a sintaxe mudou?" sem imprimir o diff, e--display jsonfoi feito para ser processado
🚀 Por que escolher o deb.griffo.io?
- Debian oficial: não empacota o difftastic — um sistema padrão não tem nada para instalar
- cargo install difftastic: atualizado, mas é uma compilação longa com muitas gramáticas do tree-sitter, fica fora do apt e sem página de manual
- Tarball upstream: o binário oficial, baixado na mão a cada lançamento
- deb.griffo.io: versão mais recente com atualizações automáticas
- ✅ Gramáticas atuais: a versão mais nova, com as gramáticas do tree-sitter que entendem as linguagens que você escreve hoje
- ✅ A única fonte apt: o difftastic não está nos arquivos do Debian nem do Ubuntu; este repositório empacota a build oficial upstream
- ✅ Atualizações automáticas: os pacotes são atualizados poucas horas após cada lançamento upstream
- ✅ Pacote completo: o binário upstream como
/usr/bin/difftmais a página de manualdifft.1 - ✅ Duas arquiteturas: amd64 (build musl estática, sem dependências) e arm64
- ✅ Multi-distribuição: funciona no Bookworm, Trixie, Forky e Sid
- ✅ Manutenção simples: atualizações com os comandos apt de sempre
📦 Repositório de build do pacote
Os pacotes Debian são construídos e mantidos automaticamente neste repositório do GitHub:
- 🔀 difftastic-debian - Builds dos últimos lançamentos
🔗 Pacotes relacionados
Também disponíveis no deb.griffo.io:
- lazygit - Interface git no terminal para preparar hunks e linhas
- Jujutsu - VCS compatível com Git e rebases de primeira classe
- ripgrep - Busca recursiva rápida na mesma árvore
- Neovim - Editor para abrir o que o diff apontou