guide/read-unified-diff.md

Como ler um unified diff (patch) — guia para revisão de código

Leia passo a passo, com exemplos, os cabeçalhos --- +++ do git diff e de arquivos patch, os números do cabeçalho de hunk @@, as linhas de contexto, a marca No newline at end of file e os cabeçalhos estendidos diff --git.

Última atualização: 2026-09-23

Revisões de código, relatos de bugs e patches trocados por e-mail usam quase sempre o formato unified diff. git diff, diff -u e o "raw diff" do GitHub usam todos esse formato. À primeira vista parece cheio de símbolos, mas as regras são simples.

A forma geral

diff --git a/greet.py b/greet.pyindex 3b18e51..a6f4c2d 100644--- a/greet.py+++ b/greet.py@@ -1,5 +1,6 @@ def greet(name):-    print("Hello " + name)+    message = f"Hello, {name}!"+    print(message)  def main():     greet("world")

De cima para baixo vêm os cabeçalhos estendidos do git, os cabeçalhos de arquivo (---, +++) e os hunks (blocos que começam com @@). Um arquivo pode ter vários hunks, e um patch pode ter vários arquivos.

Cabeçalhos de arquivo: --- e +++

Cabeçalho de hunk @@ -a,b +c,d @@

@@ -1,5 +1,6 @@ significa "mostra 5 linhas a partir da linha 1 do arquivo antes da mudança e 6 linhas a partir da linha 1 do arquivo depois".

Contando no exemplo acima, as linhas de contexto (as que começam com espaço) são 4: def greet(name):, a linha em branco, def main(): e greet("world"). Antes da mudança são 4 de contexto mais 1 linha - = 5; depois, 4 de contexto mais 2 linhas + = 6. Por isso o cabeçalho é -1,5 +1,6.

Os três tipos de linha no corpo

Primeiro caractereSignificado
EspaçoLinha de contexto, igual nos dois lados
-Linha que só existe antes (removida)
+Linha que só existe depois (adicionada)

O contexto padrão é de 3 linhas antes e depois da mudança (pode ser alterado, como em git diff -U5). As linhas de contexto servem para encontrar a posição certa ao aplicar o patch. Mesmo que os números de linha estejam um pouco deslocados, se o contexto bater o patch aplica a mudança em outra posição (offset).

Uma linha corrigida aparece como um par: uma linha - seguida de uma linha +. O formato unified não tem um símbolo próprio para "modificado", então o truque é ler alinhando o grupo de linhas - consecutivas com o grupo de linhas + logo abaixo.

\ No newline at end of file

@@ -1,2 +1,2 @@ host=example.com-port=8080\ No newline at end of file+port=8080

Indica que a linha logo acima é a última do arquivo e não termina com um caractere de quebra de linha. No exemplo, o conteúdo é o mesmo, e só o arquivo depois da mudança ganhou a quebra de linha final. Veja mais em Caracteres de fim de linha e diferenças invisíveis.

Cabeçalhos estendidos do git

As linhas que vêm depois de diff --git a/caminho b/caminho são informações adicionais exclusivas do git.

Dicas úteis na revisão

  1. Olhar primeiro a diferença nas contagens de linha do cabeçalho do hunk dá uma ideia do tamanho da mudança. -10,7 +10,30 significa 23 linhas a mais.
  2. Para filtrar hunks em que só mudaram espaços, use git diff -w. É especialmente útil em commits que misturam ajuste de indentação com mudanças reais (Opções de ignorar espaços).
  3. Para ver o que mudou dentro de uma linha, use git diff --word-diff ou cole o diff em uma ferramenta com destaque dentro da linha, como este site.
  4. Antes de aplicar um patch, confirme que ele se aplica sem problemas com git apply --check arquivo.patch. Fora de um repositório git, use patch -p1 --dry-run < arquivo.patch.

Experimente nesta ferramenta

A visualização unificada do comparador de textos mostra o grupo - e depois o grupo +, na mesma ordem deste formato, e destaca mais uma vez as palavras alteradas dentro da linha. O botão patch da barra de resultados copia o texto unified diff padrão, e o botão de salvar ao lado baixa um arquivo diff.patch. Um patch gerado com todas as opções de ignorar desativadas pode ser aplicado ao original com patch -p1 ou git apply.

Ir para o comparador de textos