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


Digamos que você abre weather-app numa segunda-feira de manhã e não consegue se lembrar exatamente do que você entregou na sexta-feira. Ou um colega de time pergunta por que a conversão de temperatura mudou semana passada, e você quer a resposta real em vez de um palpite. O commit loop cobre como um commit é salvo. Este capítulo cobre ler esse histórico novamente: o que aconteceu, quem fez, e quando. O comando para isso é git log, e aqui está tudo que ele imprime para um pequeno projeto:
$ git log
commit 4f2a1c9d8e7b6a5c4d3e2f1a0b9c8d7e6f5a4b3c
Author: Maria Silva <[email protected]m>
Date: Tue Jul 14 09:12:03 2026 +0100
Fix temperature conversion in Celsius-to-Fahrenheit formula
commit 5f3d8b21a90e7c6d5b4a3f2e1d0c9b8a7f6e5d4c
Author: João Santos <[email protected]m>
Date: Mon Jul 13 16:45:22 2026 +0100
Add five-day forecast to the dashboard
commit 1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b
Author: João Santos <[email protected]m>
Date: Mon Jul 13 11:03:47 2026 +0100
Set up project structureUm comando, e a história inteira do projeto está ali: três commits, os mais novos primeiro, cada um com quem o escreveu, quando, e por quê.
Lendo o log com git log
git log volta através de cada commit que pode ser alcançado de onde você está, o mais recente primeiro. Cada entrada mostra quatro coisas: um hash (a longa string de letras e números que identifica aquele commit exato), o autor, a data, e a mensagem que seu autor escreveu.
Um commit é todas essas quatro coisas agrupadas: um snapshot de cada arquivo rastreado naquele momento, a mensagem descrevendo a mudança, quem a fez, e um link para o commit que veio bem antes dele, seu commit pai. Esse link pai é o que transforma uma pilha de snapshots separados em um timeline real. Leia git log de cima para baixo e você está lendo aquele timeline para trás, do agora até o começo.
O hash parece intimidador no começo, mas você raramente precisa da coisa inteira. 4f2a1c9d8e7b6a5c4d3e2f1a0b9c8d7e6f5a4b3c e 4f2a1c9 apontam para o mesmo commit. Git só precisa de o suficiente do hash para distingui-lo de todo outro commit no repositório, e os primeiros sete ou mais caracteres são quase sempre o suficiente. Você verá a forma curta em todo lugar, incluindo os comandos no resto deste capítulo.
git log lista cada commit, o mais novo primeiro, com seu hash, autor, data, e mensagem. Um commit é aquele snapshot mais sua mensagem mais um link para o commit anterior. Você quase nunca precisa do hash completo, os primeiros vários caracteres são suficientes para Git saber exatamente qual commit você quer dizer. Inspecionando um commit com git show
git log diz a você que um commit aconteceu. git show <hash> diz a você exatamente o que ele fez:
$ git show 4f2a1c9
commit 4f2a1c9d8e7b6a5c4d3e2f1a0b9c8d7e6f5a4b3c
Author: Maria Silva <[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 superior é o mesmo metadado que git log mostra. Abaixo dela está a mudança real: uma linha começando com - é uma linha que o commit removeu, uma linha começando com + é uma linha que foi adicionada, e linhas sem marca são contexto que permaneceu igual. Aqui isso lê claramente: a linha velha agrupou 32 dentro dos parênteses, então foi adicionada antes da multiplicação acontecer. O fix agrupa os parênteses novamente ao redor de celsius * 9 então 32 é adicionado por último, o bug de precedência de operador que a mensagem de Maria descreve.
git show <hash> mostra um commit em cheio: quem o fez, quando, e as linhas reais que mudou. 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 git diff mostra, e a confusão que quase todo mundo tem
git log e git show leem histórico commitado. git diff lê o que não foi commitado ainda: as mudanças sentadas em seu diretório de trabalho agora, comparadas contra 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 em README.md, mostrada antes de você ter staged ou commitado qualquer coisa. Aqui está a parte que pega quase todo mundo em sua primeira semana: execute git add . para fazer stage daquela mesma mudança, depois execute git diff novamente, e ele não mostra nada.
$ git add .
$ git diffNada foi impresso. A edição não desapareceu, e nada deu errado. git diff simples compara seu diretório de trabalho contra a staging area, e uma vez que você tem tudo em stage, aqueles dois agora combinam, então não há diferença esquerda para mostrar ali. Para ver mudanças esperando na staging area, use git diff --staged em vez disso.
$ 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.Mesma mudança, agora visível, porque --staged compara a staging area contra seu último commit em vez disso.
git diff mostra edições em seu diretório de trabalho que ainda não foram feitas stage. Uma vez que você faz stage de tudo com git add, git diff simples fica em silêncio. Isso é esperado, suas mudanças ainda estão ali. Use git diff --staged para ver o que está esperando para ser commitado. Por que o histórico do Git forma um gráfico
Cada commit que você viu até agora aponta para exatamente um pai, e ler git log de cima para baixo parecia estar lendo uma linha reta. Isso se sustenta para um projeto solo trabalhando em uma linha de trabalho. Deixa de se sustentar o momento em que branches e merges entram na figura, coberto depois em Branches, porque o histórico real de um projeto pode se dividir em linhas separadas e se juntar novamente.

