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.
Já no git, cada versão contém uma representação completa do projeto, inclusive de arquivos que não foram alterados.
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:
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:
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 "-").
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
- https://git-scm.com/book - Pro Git book - livro grátis que aborda desde conceitos básicos do git até os detalhes de funcionamento interno
- https://girliemac.com/blog/2017/12/26/git-purr/ - pela inspiração de usar desenhos para ilustrar os commits no git
- https://openclipart.org/detail/274993/single-engine-airplane - imagem vetorial do avião utilizada nas ilustrações