Explicação do Git Diff: Um Guia Completo com Exemplos

O git diff é sua janela para as mudanças acontecendo em seu repositório de código. Em sua essência, é um comando que mostra as diferenças entre vários estados de seus arquivos – seja comparando seu trabalho atual com o que você já preparou ou comparando mudanças entre branches e commits. Pense nele como a maneira do Git de responder à pergunta: “O que mudou?” Quando você executa git diff, o Git analisa o conteúdo dos arquivos linha por linha, identificando o que foi adicionado, removido ou modificado, e apresenta essas informações em um formato padronizado que destaca exatamente o que mudou e onde.

O git diff ajuda os desenvolvedores a garantir a qualidade do código, fornecendo uma visão clara das modificações antes de serem confirmadas. Aqui, abordaremos como usar esse comando essencial de forma eficaz, desde comparações básicas até técnicas avançadas que melhorarão seu fluxo de desenvolvimento e colaboração em equipe.

Pré-requisitos

Para seguir este tutorial, você deve estar familiarizado com estes conceitos do Git:

  • Fluxo básico do Git (init, add, commit)
  • Repositórios Git e sua estrutura
  • Ramos e como funcionam
  • Commits e histórico de commits
  • A área de preparação (index)

Se precisar revisar esses conceitos, estes recursos serão úteis:

Você precisará do Git instalado em seu sistema para seguir os exemplos. Todos os comandos podem ser executados em um terminal ou prompt de comando.

Por que o Git Diff é Essencial para Desenvolvedores

Todo desenvolvedor precisa saber o que mudou em seu código, seja trabalhando sozinho ou em uma equipe de centenas. Sem o git diff, você ficaria tentando adivinhar quais linhas foram alteradas, tornando a solução de problemas e a colaboração quase impossíveis.

O git diff é essencial para o gerenciamento de mudanças e serve de base para a construção de software de qualidade por meio de processos de revisão eficazes. Ao examinar as mudanças, o git diff fornece o contexto necessário para entender não apenas o que mudou, mas por que essas mudanças são importantes.

Essa visibilidade direta na evolução do código ajuda as equipes a manter padrões e evitar que bugs cheguem à produção.

À medida que os projetos crescem em complexidade, o git diff se torna verdadeiramente indispensável por várias razões-chave:

  • Verificação de mudanças: Confirme exatamente o que você está prestes a confirmar, evitando a inclusão acidental de código de depuração ou mudanças não relacionadas
  • Transferência de conhecimento: Compreender o que os colegas de equipe fizeram sem ter que ler arquivos inteiros
  • Resolução de conflitos: Identificar exatamente onde e como as alterações entram em conflito durante mesclagens
  • Análise histórica: Rastrear quando alterações específicas foram introduzidas para procurar bugs ou entender a evolução de recursos
  • Revisões de código direcionadas: Concentre a atenção nas partes do código que realmente mudaram, economizando tempo e melhorando a qualidade da revisão

Para usar efetivamente o git diff, é necessário entender a arquitetura subjacente que permite essas comparações – o modelo “Três-Árvores” do Git.

Arquitetura de Três-Árvores do Git

Para entender o git diff, você primeiro precisa compreender a arquitetura fundamental de “três-árvores” do Git. Apesar do nome, essas não são árvores reais no sistema de arquivos, mas sim três estados distintos onde seu código existe.

Pense nesses estados como três versões diferentes do seu projeto que o Git mantém rastreadas simultaneamente: o Diretório de Trabalho (seus arquivos reais), a Área de Staging (ou índice, onde as alterações são preparadas para serem confirmadas) e o Repositório (o histórico confirmado do seu projeto armazenado no diretório .git).

Fonte: Hashnode

O Diretório de Trabalho contém os arquivos que você está editando ativamente – é aqui que você escreve código, faz alterações e testa seu trabalho. A Área de Staging atua como uma zona de preparação onde você seleciona quais alterações devem ser incluídas no próximo commit. Você pode pensar nela como um pátio de carga onde os pacotes (suas alterações) são organizados antes do envio.

Finalmente, o Repositório armazena o histórico completo do seu projeto como uma série de commits, snapshots do seu código em pontos específicos no tempo, ligados para formar uma cadeia histórica.

O Git diff opera comparando esses três estados em várias combinações. Quando você executa git diff sem argumentos, ele compara seu Diretório de Trabalho com a Área de Preparação, mostrando as alterações que você fez mas ainda não preparou.

Usando git diff --staged compara a Área de Preparação com o último commit, mostrando o que será incluído no seu próximo commit.

E git diff HEAD compara seu Diretório de Trabalho diretamente com o último commit, mostrando todas as alterações não confirmadas, independentemente do status de staging.

Esses pontos de comparação formam a base para todas as operações de diff no Git:

  • Diretório de Trabalho ↔ Área de Staging: Quais alterações eu fiz, mas ainda não stagiei? (git diff)
  • Área de preparação ↔ Repositório: Quais mudanças eu preparei que serão commitadas em seguida? (git diff --staged)
  • Diretório de trabalho ↔ Repositório: Qual é a diferença total entre meus arquivos de trabalho e o último commit? (git diff HEAD)
  • Entre Commits: Como o código evoluiu entre pontos específicos da história? (git diff commit1-hash commit2-hash)

Entender essa arquitetura fornece o modelo mental necessário para usar o git diff de forma eficaz para identificar exatamente o que mudou, onde e quando em sua base de código.

Com essa compreensão arquitetural em vigor, agora podemos explorar como usar comandos git diff na prática para obter insights sobre a evolução do seu código entre esses três estados.

Uso Básico do Git Diff

Vamos criar um projeto de análise de dados de amostra para demonstrar o git diff em ação. Vamos configurar um pequeno repositório com scripts Python, dados CSV e arquivos de texto que podemos modificar ao longo deste tutorial.

# Criar e inicializar nosso projeto mkdir data-analysis-project cd data-analysis-project git init # Criar arquivos iniciais echo "# Data Analysis Project\nA sample project to demonstrate git diff functionality." > README.md echo "import pandas as pd\n\ndef load_data(filename):\n return pd.read_csv(filename)\n\ndef analyze_data(data):\n return data.describe()" > analysis.py echo "id,name,value\n1,alpha,10\n2,beta,20\n3,gamma,30" > data.csv echo "DEBUG=False\nDATABASE_PATH=./data/" > config.txt echo "def normalize_data(data):\n return (data - data.min()) / (data.max() - data.min())" > utils.py # Fazer nosso primeiro commit git add . git commit -m "Initial commit with basic project structure" # Verificar a estrutura do diretório > tree . ├── README.md ├── analysis.py ├── config.txt ├── data.csv └── utils.py

Nosso projeto agora possui cinco arquivos sob controle de versão, nos dando uma base para demonstrar vários cenários de diff. Conforme avançamos, vamos modificar esses arquivos para mostrar como o git diff revela mudanças em diferentes contextos.

Compreendendo os resultados do git diff

Ao executar um comando git diff, a saída segue um formato padronizado projetado para indicar claramente o que mudou. Vamos modificar nosso arquivo analysis.py para ver um diff em ação:

# Atualizar analysis.py com uma nova função echo "import pandas as pd\n\ndef load_data(filename):\n return pd.read_csv(filename)\n\ndef analyze_data(data):\n return data.describe()\n\ndef visualize_data(data):\n return data.plot(kind='bar')" > analysis.py

Agora vamos examinar o git diff resultante:

git diff

Você verá uma saída semelhante a esta:

Nota: Para sair da saída do git diff, pressione “q” no seu terminal.

Vamos analisar essa saída:

  1. O cabeçalho (diff --git a/analysis.py b/analysis.py) mostra qual arquivo está sendo comparado, que é analysis.py
  2. O metadados do arquivo (index db0e049..a7a7ab0 100644) mostra identificadores internos do Git para as versões anterior e posterior
  3. Os marcadores de arquivo (--- a/analysis.py e +++ b/analysis.py) indicam os arquivos “antes” e “depois”
  4. O cabeçalho do pedaço (@@ -5,3 +5,6 @@) mostra quais linhas foram afetadas. Essa notação pode ser interpretada como:
  • -5,3 significa que a partir da linha 5 no arquivo original, 3 linhas são mostradas na diferença
  • +5,6 significa que a partir da linha 5 no arquivo modificado, 6 linhas são mostradas na diferença
  • A diferença entre esses números indica que 3 linhas foram adicionadas

5. O conteúdo muda com linhas começando com + mostrando adições

Nos arquivos maiores, o git diff agrupa as alterações em “hunks” – seções do arquivo que contêm mudanças. Cada hunk tem seu próprio cabeçalho com números de linha para ajudá-lo a localizar as alterações no arquivo.

Comparando o diretório de trabalho e a área de preparação

Executar git diff sem argumentos compara seu Diretório de Trabalho (estado atual dos arquivos) com a Área de Preparação (alterações prontas para serem confirmadas). Isso é útil para revisar o que você alterou, mas ainda não preparou para o próximo commit.

Vamos modificar vários arquivos para demonstrar:

# Atualize README.md echo "# Data Analysis Project\nA sample project to demonstrate git diff functionality.\n\n## Installation\nRun \pip install -r requirements.txt" > README.md # Atualize data.csv echo "id,name,value\n1,alpha,10\n2,beta,20\n3,gamma,30\n4,delta,40" > data.csv

Agora vamos preparar apenas as alterações no README.md:

git add README.md

Executar git diff agora mostrará apenas as alterações não preparadas para data.csv e o arquivo analysis.py acima:

Isso ajuda a focar no que ainda não foi preparado. Se você deseja ver o que já foi preparado:

git diff --staged # or git diff --cached (they're synonyms)

Isso mostrará as alterações em README.md que estão preparadas e prontas para serem confirmadas. Esse fluxo de trabalho é crucial para construir confirmações limpas e lógicas. Você pode preparar partes do seu trabalho que fazem sentido juntas, revisar a diferença preparada para verificar se é uma unidade coerente de mudança e então confirmar.

Comparando a área de preparação e a última confirmação.

O git diff --staged comando compara sua Área de Preparação com seu último commit. Isso mostra exatamente o que será incluído em seu próximo commit se você executar git commit agora.

Vamos preparar as alterações no nosso data.csv e examinar o que está preparado:

git add data.csv git diff --staged

A saída agora mostrará alterações tanto no README.md quanto no data.csv, pois ambos foram preparados. Esta etapa de revisão é crítica antes de confirmar — ela atua como sua última linha de defesa contra a confirmação de alterações indesejadas.

Um fluxo de trabalho comum pode parecer:

  1. Faça alterações em vários arquivos
  2. Execute git diff para revisar todas as alterações
  3. Use git add <file> seletivamente para adicionar grupos lógicos de alterações
  4. Execute git diff --staged para verificar o que está prestes a ser confirmado
  5. Confirme as alterações adicionadas com git commit -m "Sua mensagem"
  6. Repita para outros grupos lógicos de alterações

Esta abordagem metódica ajuda a manter um histórico de commits limpo e significativo, tornando mais fácil entender como seu projeto evoluiu e identificar onde os problemas podem ter sido introduzidos. Conforme você ganha experiência, esses comandos diff se tornarão algo natural, servindo como seus companheiros constantes no processo de desenvolvimento.

Vamos fazer nossos commits antes de avançar para a próxima etapa:

# data.csv e README.md devem ser commitados git commit -m "Modify data.csv and README.md files" # Stage e commit analysis.py git add analysis.py git diff --staged # Review the changes one more time git commit -m "Add a new function to analysis.py"

Técnicas Intermediárias de Diff no Git

Agora que entendemos o básico do git diff, vamos explorar técnicas mais poderosas que vão aprimorar sua capacidade de rastrear e analisar mudanças em seus projetos. Continuaremos trabalhando em nosso projeto de análise de dados para demonstrar esses conceitos intermediários.

Comparando entre diferentes referências

O Git é construído em torno do conceito de referências – ponteiros para estados específicos do seu código. Essas referências incluem branches, commits e tags. O comando git diff pode comparar duas dessas referências para mostrar o que mudou entre elas.

Vamos criar um novo branch para desenvolver uma funcionalidade e fazer algumas alterações:

# Criar e mudar para um novo ramo git checkout -b feature/advanced-analytics # Modificar o arquivo analysis.py com uma nova função echo "import pandas as pd import numpy as np def load_data(filename): return pd.read_csv(filename) def analyze_data(data): return data.describe() def visualize_data(data): return data.plot(kind='bar') def perform_advanced_analysis(data): """Performs advanced statistical analysis on the dataset""" results = {} results['correlation'] = data.corr() results['skew'] = data.skew() return results" > analysis.py # Confirmar as mudanças git add analysis.py git commit -m "Add advanced analysis function"

Agora podemos comparar nosso ramo de funcionalidade com o ramo principal:

git diff main feature/advanced-analytics

Este comando mostra todas as diferenças entre os dois ramos – cada arquivo que foi modificado, adicionado ou excluído. Você verá as alterações que fizemos no analysis.py, incluindo nossas novas importações e função (pressione enter várias vezes, pois a diferença completa é truncada no terminal).

Para comparar com um commit específico, você pode usar o hash do commit:

git log --oneline # Find the commit hash you want to compare with

git diff 7b3105e # Replace 7b3105e with the actual commit hash you want to compare

Esta capacidade de comparação se torna inestimável quando:

  • Preparando para revisões de código ao ver todas as alterações em um ramo de funcionalidade
  • Verificando que mudanças um ramo de um colega introduziria antes de mesclar
  • Entendendo como sua base de código evoluiu entre lançamentos ou versões

Comparando arquivos específicos

Ao trabalhar com repositórios grandes, muitas vezes você deseja focar em alterações em arquivos ou diretórios específicos em vez de ver todas as diferenças. O git diff facilita isso ao permitir que você especifique caminhos.

Vamos fazer alterações em vários arquivos:

# Atualizar config.txt echo "DEBUG=True DATABASE_PATH=./data/ LOG_LEVEL=INFO" > config.txt # Atualizar utils.py echo "def normalize_data(data): return (data - data.min()) / (data.max() - data.min()) def clean_data(data): return data.dropna()" > utils.py

Para ver alterações apenas no arquivo de configuração:

git diff config.txt

Ou comparar um arquivo específico entre ramos:

# Comparar o arquivo analysis.py entre os ramos main e feature/advanced-analytics git diff main feature/advanced-analytics -- analysis.py

O -- no comando acima ajuda o Git a distinguir entre referências e caminhos de arquivos. Isso é particularmente útil quando:

  • Trabalhando em repositórios com muitos arquivos, mas focando em componentes específicos (o que muitas vezes será o caso)
  • Verificando como a configuração mudou entre branches
  • Revisando apenas os arquivos mais críticos em um grande conjunto de alterações

Opções de diff contextual

O Git diff fornece várias opções para ajustar como as diferenças são exibidas, tornando mais fácil focar em mudanças significativas.

Por exemplo, ao lidar com alterações de formatação de código, diferenças de espaçamento em branco podem obscurecer alterações semânticas importantes. Vamos demonstrar com uma alteração de formatação:

# Faça uma alteração de espaçamento em branco em analysis.py sed -i '' 's/ return/ return/g' analysis.py # Reduce indentation

Agora, ao comparar com o diff padrão do git, mostra alterações de espaçamento em branco (observe como as declarações de retorno estão desalinhadas):

git diff analysis.py # OUT: --- a/analysis.py +++ b/analysis.py @@ -2,17 +2,17 @@ import pandas as pd import numpy as np def load_data(filename): - return pd.read_csv(filename) + return pd.read_csv(filename) def analyze_data(data): - return data.describe() + return data.describe() def visualize_data(data): - return data.plot(kind='bar') + return data.plot(kind='bar') def perform_advanced_analysis(data): Performs advanced statistical analysis on the dataset results = {} results['correlation'] = data.corr() results['skew'] = data.skew() - return results + return results

Mas podemos ignorar as alterações de espaçamento em branco (isso não mostra alterações, pois apenas removemos espaçamento em branco):

git diff -w analysis.py # or --ignore-all-space

Outra opção útil é controlar linhas de contexto — as linhas não alteradas exibidas ao redor das modificações:

git diff -U1 analysis.py # Show only 1 line of context (default is 3) git diff -U5 analysis.py # Show 5 lines of context

Essas opções contextuais são particularmente valiosas quando:

  • Revisar código que passou por formatação automatizada
  • Focar em alterações funcionais em vez de alterações de estilo
  • Precisar de mais contexto para entender uma alteração específica
  • Trabalhar com arquivos grandes onde o contexto padrão geraria muito resultado

Ao dominar essas técnicas intermediárias, você terá muito mais controle sobre como revisar e entender as alterações em sua base de código, tornando seu fluxo de trabalho de desenvolvimento mais eficiente e suas revisões de código mais eficazes.

Vamos confirmar as últimas alterações antes de avançarmos para aplicações avançadas de diff do git:

git add . git commit -m "Modify analysis.py, config.txt, and utils.py"

Aplicações Avançadas de Diff do Git

Construindo sobre nosso entendimento das técnicas intermediárias do git diff, vamos explorar algumas aplicações avançadas que levarão suas habilidades no Git para o próximo nível. Essas técnicas avançadas são particularmente úteis ao trabalhar em bases de código complexas ou colaborar com equipes maiores.

Usando ferramentas de diff externas

Embora o diff integrado do Git seja poderoso, às vezes uma ferramenta de diff visual fornece melhor clareza, especialmente para alterações complexas. O Git permite que você configure ferramentas externas para aprimorar sua experiência de diff.

Vamos configurar uma ferramenta de diff visual popular. Vamos usar o VSCode como exemplo, mas uma configuração similar funciona para ferramentas como Beyond Compare, Meld ou KDiff3:

# Configure o Git para usar o VSCode como a ferramenta de diff (específico do projeto) git config diff.tool vscode git config difftool.vscode.cmd "code --wait --diff \$LOCAL \$REMOTE" # Para usar outras ferramentas populares, você pode usar: # Para Beyond Compare (específico do projeto): git config diff.tool bc3 git config difftool.bc3.path "/path/to/beyond/compare" # Comandos de instalação: # Para Beyond Compare: # No macOS: brew install --cask beyond-compare # No Ubuntu: sudo apt-get install beyond-compare # No Windows: Baixe em https://www.scootersoftware.com/download.php # Observação: Para aplicar essas configurações globalmente em vez de apenas no projeto atual, # adicione a flag --global a cada comando, por exemplo: # git config --global diff.tool vscode

Agora, em vez de usar git diff, você pode usar:

git difftool main feature/advanced-analytics

Isso abrirá sua ferramenta de diff visual configurada para exibir as alterações. Veja como o Beyond Compare se parece:

As ferramentas de diff visual oferecem várias vantagens:

  1. Comparação lado a lado facilitando a visualização do contexto
  2. Realce de sintaxe que se alinha com suas preferências de editor
  3. Navegação avançada entre as alterações
  4. Capacidade de editar arquivos diretamente durante a revisão das diferenças

Ao revisar grandes alterações ou arquivos com estruturas complexas (como JSON ou XML aninhados), as ferramentas de diff visual podem melhorar significativamente a compreensão e a eficiência.

Comandos de diff especializados

O Git oferece comandos de diff especializados que oferecem mais controle granular para casos de uso específicos. Vamos explorar alguns desses comandos poderosos:

git diff-tree examina as diferenças entre objetos de árvore (diretórios):

# Obter o hash dos dois últimos commits LAST_COMMIT=$(git rev-parse HEAD) PREV_COMMIT=$(git rev-parse HEAD~1) # Mostrar as alterações no último commit git diff-tree --patch $PREV_COMMIT $LAST_COMMIT

git diff-index compara o diretório de trabalho com o índice (área de preparação) ou uma árvore:

# Comparar o diretório de trabalho com o índice git diff-index --patch HEAD

git diff-index é particularmente útil para scripts e automação. Permite verificar programaticamente quais alterações seriam incluídas no seu próximo commit, tornando-se valioso para ganchos pré-commit e scripts de validação.

Por exemplo, você pode usá-lo em um pipeline de CI/CD para verificar se certos arquivos não foram modificados ou para garantir que as alterações de configuração sigam padrões específicos antes de permitir commits.

git diff-files mostra as alterações entre arquivos no diretório de trabalho e no índice:

# Verifique as diferenças para arquivos específicos git diff-files --patch config.txt

Esses comandos especializados são particularmente úteis para:

  • Criar fluxos de trabalho e scripts personalizados do Git
  • Depurar problemas com os internos do Git
  • Realizar análises direcionadas do estado do repositório
  • Construir ferramentas de automação que interagem com o Git

Analisar o histórico do código

Uma das aplicações mais poderosas do git diff é analisar como o código evoluiu ao longo do tempo, o que pode ser crucial para depuração ou compreensão do desenvolvimento de recursos.

Vamos examinar um commit específico usando a notação especial ^!:

# Obter o hash do nosso commit de análise avançada ANALYTICS_COMMIT=$(git log --oneline | grep "advanced analysis" | cut -d ' ' -f 1) # Mostrar apenas as alterações introduzidas nesse commit específico git diff $ANALYTICS_COMMIT^!

A sintaxe ^! é uma forma abreviada de comparar um commit com seu pai, mostrando exatamente o que mudou apenas nesse commit.

Para rastrear como um arquivo específico evoluiu ao longo do tempo:

# Analisar como analysis.py mudou nos últimos 3 commits git log -p -3 analysis.py

Ao procurar por um bug, você pode usar git diff com git bisect:

# Adicionar um bug para simular uma regressão echo "import pandas as pd import numpy as np def load_data(filename): # Bug: retornando acidentalmente None em vez dos dados pd.read_csv(filename) return None def analyze_data(data): return data.describe() def visualize_data(data): return data.plot(kind='bar') def perform_advanced_analysis(data): results = {} results['correlation'] = data.corr() results['skew'] = data.skew() return results" > analysis.py git add analysis.py git commit -m "Update analysis.py with a hidden bug" # Agora use o git bisect para encontrar quando o bug foi introduzido git bisect start git bisect bad # Mark current commit as containing the bug git bisect good main # Mark the main branch as working correctly # O Git irá verificar os commits para que você possa testar # Uma vez encontrado, você pode examinar a alteração exata que introduziu o bug git diff HEAD^!

O Git bisect é uma ferramenta poderosa de depuração que realiza uma busca binária em seu histórico de commits para encontrar qual commit introduziu um bug. Combinado com git diff, ele cria um fluxo de trabalho eficiente:

1. Inicie o processo de bissecção com git bisect start

2. Marque o commit atual como ruim (contendo o bug) com git bisect bad

3. Marque um commit conhecido como bom (onde o bug não existe) com git bisect good <hash-do-commit>

4. O Git automaticamente verifica um commit no meio da sua história para você testar.

5. Após testar o commit atual, informe ao Git o resultado:

  • Se o bug existir neste commit: git bisect bad
  • Se o bug não existir neste commit: git bisect good

6. O Git continuará verificando diferentes commits com base no seu feedback (após cada comando git bisect bad/good), reduzindo a busca a cada vez. Repita o processo de teste e marcação até o Git identificar o primeiro commit ruim.

7. Uma vez que o Git encontra o commit problemático, ele exibirá uma mensagem indicando qual commit introduziu o bug.

8. Examine exatamente o que mudou no commit identificado com: git diff HEAD^!

9. Esse comando mostra exatamente qual código foi modificado no commit que introduziu o bug, permitindo que você concentre seus esforços de depuração nessas alterações específicas.

10. Saia do bisect a qualquer momento com: git bisect reset Isso vai te devolver para o branch em que você estava antes de iniciar o processo de bisect.

11. Você também pode automatizar o processo de bisect com: git bisect run <test-script> Onde é um comando que retorna 0 para commits bons e diferente de zero para commits ruins.

Esse fluxo de trabalho reduz dramaticamente o tempo de depuração, especialmente em grandes bases de código com muitos commits entre estados funcionais e quebrados.

Essas técnicas de análise de histórico são inestimáveis para:

  • Encontrar quando e por que um bug foi introduzido
  • Compreender a evolução de um recurso ou componente
  • Auditar alterações para revisões de segurança
  • Documentar o processo de tomada de decisão por trás das alterações de código

Ao dominar essas aplicações avançadas do git diff, você será capaz de navegar na história do seu projeto com precisão, depurar problemas de forma mais eficiente e obter insights mais profundos sobre a evolução de sua base de código.

Referência de Comando Git Diff

O Git diff oferece uma ampla gama de opções para personalizar sua saída e comportamento para situações específicas. Aqui está uma referência abrangente dos parâmetros mais comumente usados para aprimorar sua análise diferencial:

Opções básicas de comparação

  • git diff – Comparar diretório de trabalho com área de preparação
  • git diff --staged (ou --cached) – Comparar área de preparação com último commit
  • git diff HEAD – Comparar diretório de trabalho com último commit
  • git diff <commit> – Comparar diretório de trabalho com commit específico
  • git diff <commit1> <commit2> – Comparar dois commits específicos
  • git diff <branch1> <branch2> – Comparar dois branches

Limitação de caminho

  • git diff -- <caminho> – Limitar a comparação a um arquivo ou diretório específico
  • git diff --stat – Mostrar resumo das mudanças (arquivos alterados, inserções, exclusões), uma opção muito útil para diffs grandes
  • git diff --name-only – Mostrar apenas nomes dos arquivos alterados
  • git diff --name-status – Mostra nomes e status (adicionado, modificado, excluído) dos arquivos alterados

Mostra controle

  • git diff -w (ou –ignore-all-space) – Ignora alterações de espaço em branco
  • git diff --ignore-space-change – Ignora alterações na quantidade de espaços em branco
  • git diff --color-words – Mostra diferenças ao nível de palavra com cor
  • git diff --word-diff – Mostra diferenças ao nível de palavras em um formato diferente
  • git diff -U<n> – Mostra n linhas de contexto (o padrão é 3)
  • git diff --no-prefix – Não mostra prefixos a/ e b/ na saída do diff

Filtragem de conteúdo

  • git diff --binary – Mostra alterações em arquivos binários
  • git diff -S<string> – Procura por alterações que adicionam ou removem a string especificada
  • git diff -G<regex> – Procura por alterações que correspondem ao padrão regex especificado
  • git diff --pickaxe-all – Ao usar -S ou -G, mostrar todas as alterações no arquivo, não apenas as correspondentes

Opções de formato

  • git diff --patch-with-stat – Mostrar patch e resumo estatístico
  • git diff --compact-summary – Mostrar resumo estatístico em um formato compacto
  • git diff --numstat – Mostrar estatísticas em um formato amigável para máquina
  • git diff --summary – Mostrar resumo de criação/exclusão

Essas opções podem ser combinadas para criar comparações poderosas e direcionadas. Por exemplo, para ver mudanças ao nível das palavras em um arquivo específico enquanto ignora espaços em branco:

git diff --color-words -w -- analysis.py

Ou para encontrar todos os lugares onde uma função específica pode ter sido adicionada ou removida:

git diff -S"def perform_advanced_analysis" main feature/advanced-analytics

Compreender essas opções ajuda você a cortar o ruído e focar precisamente nas mudanças que importam, tornando seus fluxos de trabalho de revisão e análise de código mais eficientes. Seja para caçar bugs, se preparar para uma solicitação de recebimento ou apenas tentar entender o que mudou, a opção de diff certa do git pode facilitar significativamente sua tarefa.

Conclusão

Ao longo deste artigo, exploramos o git diff como um comando versátil para visualizar alterações de código. Cobrimos a comparação de arquivos de trabalho com alterações em estágio, examinando diferenças entre branches e commits, e utilizando comandos especializados para insights mais profundos. Incorporar o git diff em seu fluxo de trabalho ajuda a construir commits mais limpos, identificar problemas precocemente e facilitar melhores revisões de código.

Seja trabalhando sozinho ou em equipe, dominar o git diff eleva você de simplesmente escrever código para entender como sua base de código evolui ao longo do tempo.

Para continuar aprimorando sua expertise em Git, confira esses recursos valiosos:

Esses recursos ajudarão você a aprofundar o que aprendeu sobre git diff e elevar sua maestria no controle de versão para o próximo nível.

Source:
https://www.datacamp.com/tutorial/git-diff-guide