Inspetor de patches e diffs
Pega um diff unificado — colado, ou um arquivo .patch vindo do git format-patch, de uma URL .patch do GitHub ou de uma lista de discussão — e mostra o que ele faz antes de você aplicá-lo. Você recebe o assunto, o autor e a data do commit quando o patch traz cabeçalho de e-mail, e depois uma tabela por arquivo: o caminho, se o arquivo é adicionado, removido, modificado, renomeado, teve mudança de modo ou é binário, e o número exato de linhas adicionadas e removidas, contadas do jeito que o git conta. O que importa é a parte que responde à pergunta que você realmente tem: se isso vai aplicar limpo. Um diff unificado se autodescreve: cada cabeçalho de hunk diz quantas linhas cobre de cada lado, como em @@ -1,4 +1,5 @@, e o git confere o corpo contra essa afirmação antes de tocar em qualquer coisa. Quando os dois divergem — porque um cliente de e-mail requebrou uma linha, porque alguém editou o patch à mão, ou porque uma linha de contexto perdeu o espaço inicial no caminho — o git recusa com `corrupt patch at line N` e nenhuma explicação do que esperava. Esta ferramenta faz a mesma aritmética e mostra o hunk, o que o cabeçalho prometia e o que o corpo de fato contém. Ela também sinaliza as falhas mais silenciosas: quebras de linha CRLF que não vão casar com arquivos LF, linhas adicionadas com espaços no fim que um hook de pre-commit vai rejeitar, uma quebra de linha final ausente, e um cabeçalho de arquivo sem hunk nenhum. Tudo roda no seu navegador: o patch nunca é enviado.
| Caminho | Mudança | Adicionadas | Removidas | hunks |
|---|---|---|---|---|
| src/app.js | modificado | +2 | −1 | 1 |
| README.md | adicionado | +2 | — | 1 |
Como usar
- Cole um diff unificado na caixa, ou solte sobre ela um arquivo .patch ou .diff.
- Leia os totais para ver o tamanho da mudança: arquivos tocados, inserções, remoções e número de hunks.
- Percorra a tabela até os arquivos que interessam; os renomeados mostram o caminho antigo ao lado do novo.
- Confira o que estiver destacado em âmbar antes de rodar git apply — são os motivos pelos quais ele falharia.
- Para um patch vindo de e-mail, compare o aviso do hunk com `git apply --check`, que relata a mesma corrupção com menos detalhe.
Perguntas frequentes
- O que `corrupt patch at line N` significa de fato?
- Significa que o corpo do hunk não continha o número de linhas que seu cabeçalho declarou. Um cabeçalho como @@ -1,4 +1,5 @@ promete quatro linhas do lado antigo (contexto mais remoções) e cinco do novo (contexto mais adições). O git conta enquanto lê e para no instante em que a aritmética quebra, relatando a linha a que chegou e não o cabeçalho que estava errado. Quase sempre a causa é o transporte: um cliente de e-mail requebrou uma linha longa, ou tirou o único espaço inicial que marca uma linha de contexto, e um lado fica curto. Esta ferramenta aponta o hunk, as contagens prometidas e as entregues, o que normalmente basta para corrigir à mão.
- Por que linhas de contexto em branco quebram tantos patches?
- Porque uma linha de contexto é marcada por um único espaço inicial, então uma linha em branco sem alteração acaba sendo uma linha formada por exatamente um espaço. Isso é invisível, e um bocado de ferramentas o remove: editores que tiram espaços finais ao salvar, clientes de e-mail, aplicativos de chat, copiar e colar através de um terminal. Assim que o espaço some, a linha é lida como vazia em vez de contexto, e o hunk fica uma linha curto dos dois lados. É o jeito mais comum de um patch que parecia certo na tela não aplicar.
- Esta ferramenta aplica o patch ou o confere contra meus arquivos?
- Não, e não pode. Ela lê o patch em si — a aritmética dentro do diff — sem acesso aos arquivos que ele mira. Isso basta para pegar um patch corrompido ou estragado, que é uma propriedade só do patch. Ela não sabe dizer se as linhas de contexto casam com a sua árvore de trabalho, então um patch que aqui sai bem formado ainda pode ser recusado com `does not apply` se o arquivo tiver seguido em frente. Para essa checagem são necessários os arquivos, e o comando é `git apply --check`.
- Ele lê a saída de um `diff -u` comum além de um patch do git?
- Sim. Um patch do git acrescenta a linha `diff --git`, a linha index, os metadados de renomeação e modo e — vindo do git format-patch — um cabeçalho de e-mail, e tudo isso é lido quando está presente. Um diff unificado simples do diff -u não tem nada disso: começa direto num par de cabeçalhos `--- ` / `+++ `, e é tratado igual. Renomeações e mudanças de modo simplesmente não podem ser detectadas na forma simples, porque o formato não tem como expressá-las.
- Por que a contagem de linhas aqui difere da que o GitHub mostra?
- A visão de arquivos do GitHub conta as mesmas linhas, mas o resumo às vezes difere porque ele esconde arquivos gerados, recolhe diffs grandes e exclui binários dos totais. Esta ferramenta conta todos os hunks do patch que você deu, que é o mesmo número que o `git apply --numstat` relata. Se os totais divergirem, verifique se o patch que você tem é a mudança inteira — uma URL .patch de um único commit não vai bater com o diff acumulado de um pull request.
- Meu patch é enviado para algum lugar?
- Não. O texto é analisado por JavaScript nesta página e nunca enviado a lugar nenhum; o mesmo vale para um arquivo solto, que é lido com a API de arquivos do navegador. Você pode confirmar carregando a página, desconectando-se da rede e colando um diff — continua funcionando. Vale saber, porque um patch costuma ser a coisa mais sensível de uma revisão: contém código não publicado, por inteiro.
Ferramentas relacionadas
Construtor de JSON Patch (RFC 6902)
Gere um JSON Patch RFC 6902 de um par source/target, ou aplique um patch existente a um documento. Suporta ops add, remove, replace, move, copy, test.
Visualizador de Diferenças de Texto
Compare dois textos e veja adições e remoções linha por linha ou palavra por palavra.
Testador de .gitignore
Cole um .gitignore e uma lista de caminhos: veja quais são ignorados e qual linha decidiu, como responde o git check-ignore -v.
Ferramentas Semver (Parser, Comparador, Bump)
Faz parse, compara e incrementa versões semânticas lado a lado, com um expansor de range que mostra o que ^x.y.z e ~x.y.z realmente cobrem.
Gerador de mensagens Conventional Commits
Crie uma mensagem Conventional Commits com tipo, escopo, mudança incompatível e rodapés, no seu navegador.
Gerador de .gitignore
Marque linguagens, frameworks, editores e sistemas operacionais que você usa — obtenha um `.gitignore` combinado pronto pra colocar num repo novo.