Git diff: visualizando mudanças antes de commitar

1. O que é o git diff e por que usá-lo?

O git diff é um comando fundamental do Git que permite comparar diferenças entre versões de arquivos no repositório. Ele exibe exatamente o que foi adicionado, removido ou modificado em termos de linhas de código, tornando-se uma ferramenta indispensável para revisar alterações antes de confirmá-las com um commit.

Os principais benefícios de usar git diff incluem:
- Evitar commits com erros: você pode verificar se as mudanças estão corretas antes de confirmá-las
- Revisar o escopo das alterações: entender exatamente o que será incluído no próximo commit
- Detectar mudanças indesejadas: identificar arquivos modificados acidentalmente

É importante diferenciar git diff de git status. Enquanto git status mostra uma visão geral de quais arquivos foram modificados, adicionados ou removidos, o git diff exibe o conteúdo detalhado dessas mudanças, linha por linha.

2. git diff sem argumentos: mudanças não staged

Quando executado sem argumentos, git diff compara as alterações no diretório de trabalho (working directory) com o que está na área de staging. Isso mostra as modificações que ainda não foram preparadas para commit.

Exemplo prático:

Suponha que você tenha um arquivo app.py com o seguinte conteúdo original:

def saudacao():
    print("Olá, mundo!")

Você modifica o arquivo para:

def saudacao(nome):
    print(f"Olá, {nome}!")

Executando git diff, a saída será:

diff --git a/app.py b/app.py
index e69de29..d4c3b2a 100644
--- a/app.py
+++ b/app.py
@@ -1,2 +1,2 @@
-def saudacao():
-    print("Olá, mundo!")
+def saudacao(nome):
+    print(f"Olá, {nome}!")

Interpretação da saída:
- Linhas começando com - (vermelho) indicam linhas removidas
- Linhas começando com + (verde) indicam linhas adicionadas
- As linhas sem prefixo são contexto, mostrando linhas inalteradas próximas às mudanças
- O cabeçalho @@ -1,2 +1,2 @@ indica a localização das mudanças (arquivo original linha 1, 2 linhas; novo arquivo linha 1, 2 linhas)

3. git diff --staged (ou --cached): mudanças no staging area

Após usar git add para preparar arquivos para commit, use git diff --staged (ou a forma equivalente git diff --cached) para ver exatamente o que será incluído no próximo commit. Este comando compara a staging area com o último commit.

Exemplo:

# Modifica o arquivo app.py
echo "print('Nova linha')" >> app.py

# Adiciona à staging area
git add app.py

# Visualiza as mudanças staged
git diff --staged

Saída esperada:

diff --git a/app.py b/app.py
index d4c3b2a..a1b2c3d 100644
--- a/app.py
+++ b/app.py
@@ -2,3 +2,4 @@ def saudacao(nome):
     print(f"Olá, {nome}!")
+print('Nova linha')

Isso permite revisar o conteúdo exato que será commitado, evitando surpresas desagradáveis após o commit.

4. Opções úteis para personalizar a saída

O Git oferece várias opções para tornar a saída do diff mais legível ou focada em aspectos específicos.

git diff --color-words

Destaca mudanças palavra por palavra, em vez de linha por linha:

git diff --color-words

Isso é útil para alterações em textos longos ou documentação, onde apenas algumas palavras mudaram.

git diff --stat

Mostra um resumo estatístico das mudanças:

git diff --stat

Saída exemplo:

app.py | 3 ++-
README.md | 1 +
2 files changed, 3 insertions(+), 1 deletion(-)

Ignorar espaços

  • git diff --ignore-space-change: ignora mudanças na quantidade de espaços em branco
  • git diff --ignore-all-space: ignora completamente espaços em branco
git diff --ignore-space-change

Essas opções são particularmente úteis quando você reformatou o código e quer focar apenas em mudanças de conteúdo.

5. Comparando branches e commits específicos

O git diff também permite comparar branches e commits arbitrários.

Comparando dois branches

git diff main..feature-branch

Isso mostra todas as diferenças entre o branch main e o branch feature-branch.

Comparando dois commits

git diff abc123 def456

Substitua abc123 e def456 pelos hashes dos commits que deseja comparar.

O que mudou no último commit

git diff HEAD~1 HEAD

Este comando é equivalente a git show sem o log do commit, mostrando exatamente o que foi alterado no commit mais recente.

6. Diferenças entre diretórios e arquivos específicos

Você pode restringir o diff a arquivos ou diretórios específicos usando --.

Visualizar mudanças em um único arquivo

git diff -- app.py

Filtrar por diretório

git diff -- src/

Combinando com opções

git diff --staged -- src/components/

Isso mostra apenas as mudanças staged no diretório src/components/.

7. Boas práticas ao usar git diff

Revisar sempre antes de git commit

Antes de cada commit, execute git diff --staged para verificar se todas as mudanças são intencionais e estão completas.

Usar git diff com git add -p

O staging interativo (git add -p) permite adicionar partes específicas de arquivos. Use git diff para revisar o resultado final:

git add -p
git diff --staged

Integrar com ferramentas externas

Configure um difftool para visualização mais amigável:

git difftool --staged

Ferramentas populares incluem Meld, Beyond Compare e vimdiff.

Dicas adicionais

  • Use git diff --check para detectar conflitos de merge ou espaços em branco problemáticos
  • Combine git diff com grep para buscar padrões específicos nas mudanças
  • Crie aliases para comandos frequentes: git config --global alias.df "diff --color-words"

Seguindo essas práticas, você reduzirá significativamente a chance de cometer erros e manterá um histórico de commits mais limpo e significativo.

Referências