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 brancogit 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 --checkpara detectar conflitos de merge ou espaços em branco problemáticos - Combine
git diffcomgreppara 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
- Git Documentation: git-diff — Documentação oficial do comando
git diff, com todas as opções e exemplos detalhados. - Atlassian Git Tutorial: git diff — Tutorial prático sobre
git diffcom exemplos visuais e casos de uso comuns. - Git SCM Book: Viewing the Staging and Unstaged Changes — Capítulo do livro oficial do Git explicando como visualizar mudanças staged e unstaged.
- Git Tower: git diff — Guia interativo com exemplos práticos de uso do
git diffem diferentes cenários. - FreeCodeCamp: Git Diff Command – How to Compare Changes in Your Code — Artigo detalhado sobre o comando
git diffcom exemplos de código e explicações claras.