git - snapshots, não diferenças

git - snapshots, não diferenças

Photo by Yancy Min on Unsplash

Nesse primeiro artigo que escrevo, trago um conceito essencial do git que me ajudou a entender e trabalhar muito melhor com essa fantástica ferramenta de controle de versão.

snapshots, não diferenças

Bem nos primeiros capítulos do livro Pro Git (que é gratuito e disponibilizado no site do git), ele cita uma diferença fundamental em relação a outros sistemas de controle de versão como CVS, SVN etc.

Essa diferença é de que em outros sistemas, as versões (commits) do projeto ao longo do tempo geralmente são representadas pelas alterações que foram realizadas em relação à versão anterior.

deltas.png

Já no git, cada versão contém uma representação completa do projeto, inclusive de arquivos que não foram alterados.

snapshots.png

fonte: git-scm.com/book/en/v2/Getting-Started-What..

A maioria das pessoas com quem converso relatam que não tinham essa percepção de que commits são snapshots completos do projeto. Eu mesmo demorei um certo tempo até internalizar essa informação e mudar a forma como vejo commits em um repositório git.

log

Para ilustrar esse conceito de snapshots, represento a seguir o log (histórico) de um repositório onde está sendo construído um avião:

log.png

Cada imagem representa um commit no repositório e sua mensagem.

O segundo commit possui, além do trem de pouso que foi adicionado, a fuselagem que já existia antes.

Obs.: costumamos descrever nas mensagens de commit as alterações em relação à versão anterior, o que pode acabar nos influenciando a pensar em commits como diferenças.

As setas entre os commits estão em direção contrária à da linha do tempo pois representam as referências de um commit para o outro (parent commit). Um commit nunca conhece seus commits seguintes, somente seus antecessores diretos.

diffs

"Um commit só não faz diff"

Dado que um commit representa uma fotografia do projeto inteiro em um determinado instante, não é possível identificar diferenças olhando apenas para um commit. Um diff sempre envolve pelo menos 2 commits.

No histórico do avião por exemplo, comparando o primeiro com o terceiro commit teremos o seguinte diff:

git-diff.png

O diff geralmente indica em verde e com sinal "+" as coisas que foram adicionadas. Nesse caso o trem de pouso, asas e estabilizadores.

Se compararmos os commits em ordem inversa, o diff indicará que esses mesmos elementos foram removidos (em vermelho e com sinal "-").

git-diff-inverse.png

conclusão

  • commits no git são snapshots do seu projeto, não diferenças
  • diferenças requerem no mínimo 2 commits, geralmente 2
  • podemos comparar quaisquer commits do histórico do repositório

Esse artigo faz parte de uma série: https://lluccia.hashnode.dev/series/git-conceitual

referências