Arquitetura e Estados -Parte 1
Tags: git, beginners
Published: 2021-06-14 18:50:31

Antes de mais nada, todo esse guia é baseado no livro "Pro Git"(incluindo a fonte das imagens) que pode ser baixado na versão PDF [aqui](https://github.com/progit/progit2/releases/download/2.1.304/progit.pdf) e na versão EPUB [aqui](https://github.com/progit/progit2/releases/download/2.1.304/progit.epub). O livro é GRATUITO, então se você sabe inglês e quer se aprofundar mais esse é o caminho.

## Arquitetura e Funcionamento
O Git é um VCS(Version Control System) utilizado amplamente para o processo de desenvolvimento de software. As ferramentas VCS registram as mudanças em um conjunto de arquivos e são responsáveis principalmente pela edição de arquivos por mais de uma pessoa "ao mesmo tempo", além disso também vem com ferramentas para resolver conflitos de versões e outras mais.

De maneira bem simplória o Git é uma espécie de Google Drive com versionamento. Diferente de outros VCS de mercado o Git trabalha com o arquivo completo para cada versão diferente criada ao longo do tempo, já os outros trabalham salvando apenas as alterações(também chamada de delta) dos arquivos alterados.

VCS que usam o delta:
![deltas](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2mida4o1alexytgphnr8.png)

Git:
![snapshots](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u1bcop47arfozh0gswb3.png)

Sempre que um *commit*(ou "Salvamento do estado", bem feio rsrs) do projeto é feito o Git cria uma snapshot do estado atual de todos os arquivos e grava uma referência desse estado(uma espécie de ID). Se um arquivo tem uma alteração, a cópia é feita, senão, ele não grava novamente o arquivo, ele simplesmente faz uma referência(link) para o arquivo do commit anterior.

### Estado dos arquivos
O ciclo de vida dos arquivos no Git são 3:
* **Modified** - Os arquivos foram alterados mas as mudanças não foram confirmadas;
* **Staged** - Mudanças foram confirmadas para estar no próximo commit;
* **Commited** - Dados estão salvos na base local.

Outro ponto importante são as seções de um projeto:
* **Working Directory** - Representa uma versão das muitas que um projeto pode ter. Os arquivos são descompactados da base de dados do Git e são colocados no disco para você usar;
* **Staging Area** - É simplesmente um arquivo dentro do diretório do Git que contém as informações de modificações que serão incluídas no próximo commit, uma espécie de índice;
* **Repository/Git Directory** - Local onde o Git guarda os metadados e base do projeto. Essa é a parte mais importante e é o que é copiado quando clonamos um repositório.

![seções do projeto](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2wjint59xqbagjho99qf.png)

Basicamente o Workflow fica assim(observando a imagem acima):
1. Você esta no seu Working tree e faz alterações em alguns arquivos do seu código;
2. Você escolhe quais dessas mudanças farão parte do commit e adiciona elas a Staging Area;
3. Você faz o commit, que tira uma snapshot dos arquivos da maneira que eles estão na sua Staging Area e os armazena permanentemente ao seu Git Directory.

Depois disso o fluxo se reinicia, com você fazendo novas alterações, escolhendo quais vai *commitar* e de fato fazendo o commit.

Por enquanto é isso nos vemos na próxima!