Visualizando o histórico do Git com log, show e diff


Imagine que você abre o weather-app numa segunda-feira de manhã e não lembra exatamente o que você entregou na sexta. Ou um colega de equipe pergunta por que a conversão de temperatura mudou na semana passada, e você quer a resposta real, não um palpite. O ciclo do commit explica como um commit é salvo. Este capítulo trata de ler esse histórico de volta: o que aconteceu, quem fez e quando. O comando para isso é git log, e aqui está tudo o que ele imprime para um projeto pequeno:
$ git log
commit 4f2a1c9d8e7b6a5c4d3e2f1a0b9c8d7e6f5a4b3c
Author: Priya Nair <[email protected]m>
Date: Tue Jul 14 09:12:03 2026 +0100
Fix temperature conversion in Celsius-to-Fahrenheit formula
commit 5f3d8b21a90e7c6d5b4a3f2e1d0c9b8a7f6e5d4c
Author: Kwame Boateng <[email protected]m>
Date: Mon Jul 13 16:45:22 2026 +0100
Add five-day forecast to the dashboard
commit 1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b
Author: Kwame Boateng <[email protected]m>
Date: Mon Jul 13 11:03:47 2026 +0100
Set up project structureUm comando, e toda a história do projeto está ali: três commits, do mais recente para o mais antigo, cada um com quem escreveu, quando e por quê.
Lendo o histórico com git log
O git log percorre para trás cada commit alcançável a partir de onde você está, do mais recente para o mais antigo. Cada entrada mostra quatro coisas: um hash (a longa sequência de letras e números que identifica exatamente aquele commit), o autor, a data e a mensagem que o autor escreveu.
Um commit é essas quatro coisas reunidas: uma foto de todos os arquivos rastreados naquele momento, a mensagem descrevendo a mudança, quem fez e um link para o commit imediatamente anterior, seu commit pai. Esse link com o pai é o que transforma um monte de fotos separadas numa linha do tempo de fato. Ler o git log de cima para baixo é ler essa linha do tempo de trás para frente, do presente até o começo.
O hash parece intimidador a princípio, mas você raramente precisa dele completo. 4f2a1c9d8e7b6a5c4d3e2f1a0b9c8d7e6f5a4b3c e 4f2a1c9 apontam para o mesmo commit. O Git só precisa de hash suficiente para diferenciá-lo de todos os outros commits do repositório, e os primeiros sete caracteres, mais ou menos, quase sempre bastam. Você vai ver essa forma curta em todo lugar, incluindo nos comandos do restante deste capítulo.
git log lista todo commit, do mais recente para o mais antigo, com seu hash, autor, data e mensagem. Um commit é essa foto do projeto, mais a mensagem, mais um link para o commit anterior. Você quase nunca precisa do hash completo: os primeiros caracteres já bastam para o Git saber exatamente qual commit você quer dizer. Inspecionando um commit com git show
O git log te diz que um commit aconteceu. O git show <hash> te diz exatamente o que ele fez:
$ git show 4f2a1c9
commit 4f2a1c9d8e7b6a5c4d3e2f1a0b9c8d7e6f5a4b3c
Author: Priya Nair <[email protected]m>
Date: Tue Jul 14 09:12:03 2026 +0100
Fix temperature conversion in Celsius-to-Fahrenheit formula
diff --git a/src/index.js b/src/index.js
index 3f2c1a9..7b8e2d4 100644
--- a/src/index.js
+++ b/src/index.js
@@ -12,7 +12,7 @@ function celsiusToFahrenheit(celsius) {
- return celsius * (9 / 5 + 32)
+ return (celsius * 9) / 5 + 32A metade de cima é a mesma informação que o git log mostra. Embaixo dela está a mudança propriamente dita: uma linha que começa com - é uma linha que o commit removeu, uma linha que começa com + é uma linha que ele adicionou, e as linhas sem marcação são contexto que permaneceu igual. Aqui está bem claro: a linha antiga agrupava o 32 dentro dos parênteses, então ele era somado antes mesmo da multiplicação acontecer. A correção reagrupa os parênteses em torno de celsius * 9 para que o 32 seja somado por último, o bug de precedência de operadores que a mensagem da Priya descreve.
git show <hash> mostra um commit por completo: quem fez, quando e as linhas que de fato mudaram. Linhas removidas começam com um sinal de menos, linhas adicionadas começam com um sinal de mais. É a forma mais rápida de responder "o que esse commit realmente fez". O que o git diff mostra, e a pegadinha em que quase todo mundo cai
O git log e o git show leem o histórico já commitado. O git diff lê o que ainda não foi commitado: as mudanças que estão agora no seu diretório de trabalho, comparadas com o seu último commit.
$ git diff
diff --git a/README.md b/README.md
index 1c2d3e4..9f8a7b6 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,4 @@
# weather-app
+A five-day weather dashboard built with vanilla JavaScript.Essa é a edição que você fez no README.md, mostrada antes de você ter dado stage ou commit em qualquer coisa. Aqui vem a parte que pega quase todo mundo na primeira semana: rode git add . para dar stage nessa mesma mudança e, em seguida, rode git diff de novo — ele não mostra nada.
$ git add .
$ git diffNada é impresso. A edição não desapareceu, e nada deu errado. O git diff simples compara o seu diretório de trabalho com a área de staging, e, depois que você deu stage em tudo, esses dois agora coincidem, então não sobra diferença nenhuma para mostrar ali. Para ver as mudanças que estão esperando na área de staging, use git diff --staged.
$ git diff --staged
diff --git a/README.md b/README.md
index 1c2d3e4..9f8a7b6 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,4 @@
# weather-app
+A five-day weather dashboard built with vanilla JavaScript.A mesma mudança, agora visível, porque o --staged compara a área de staging com o seu último commit, em vez do diretório de trabalho.
git diff mostra edições no seu diretório de trabalho que ainda não foram staged. Depois que você dá stage em tudo com git add, o git diff simples fica mudo. Isso é esperado, suas mudanças continuam lá. Use git diff --staged para ver o que está esperando para ser commitado. Por que o histórico do Git forma um grafo
Todo commit que você viu até agora aponta para exatamente um pai, e ler o git log de cima para baixo tem parecido como ler uma linha reta. Isso vale para um projeto solo, com uma única linha de trabalho. Isso deixa de valer no momento em que branches e merges entram em cena, assunto do próximo capítulo, Branches, porque o histórico real de um projeto pode se dividir em linhas separadas e depois voltar a se juntar.

