3.2.6 Git


Git é um sistema de controle de versão distribuído e rápido, todas as informações necessárias para representar a história de um projeto é armazenado em arquivos referenciados por um “nome de objeto” 40-digit, chamado de SHA que é algo como isto: 


6ff87c4664981e4397625791c8ea3bbb5f2279a3

 

Ao trabalhar com git encontraremos estas sequências de 40 caracteres em todo o lugar. Em cada caso, o nome é calculado tendo o hash SHA1 do conteúdo do objeto. O hash SHA1 é uma função de hash criptográfica. Isso significa para a equipe de desenvolvimento que é virtualmente impossível encontrar dois objetos diferentes com o mesmo nome. Isso tem algumas  vantagens, entre outros:

• Git pode rapidamente determinar se dois objetos são idênticos ou não, apenas pela comparação de nomes.

 

• Como os nomes de objeto são calculadas da mesma maneira em cada repositório, o mesmo conteúdo armazenado em dois repositório serão sempre armazenados sob o mesmo nome.

 

• Git pode detectar erros quando se lê um objeto, pois verifica que o nome do objeto é ainda o hash SHA1 de seu conteúdo.

 

3.2.6.1 Os Objetos


Cada objeto é composto de três coisas – um tipo, um tamanho e conteúdo. O tamanho é simplesmente o tamanho do conteúdo, o conteúdo depende de que tipo de objeto que é, e existem quatro tipos diferentes de objetos: "blob", "tree", "commit", and "tag".

• Bold "bolha" é usado para armazenar arquivos de dados - que geralmente é um arquivo.

 

• Tree "árvore" é, basicamente, como uma pasta - ele faz referência a um monte de outras árvores e/ou bolhas (por exemplo os arquivos e sub-diretórios).

 

• commit "confirmação" aponta para uma única árvore, marcando-a como o que o projeto parecia em um determinado ponto no tempo. Ele contém meta-dados sobre esse ponto do tempo, como um carimbo do tempo, o autor das mudanças desde o último commit, um ponteiro para o(s) commit(s) anterior(es), etc.

 

• "Tag" é uma forma de marcar um commit específico como especial de alguma forma. É normalmente utilizado para marcar certas lançamentos específicos ou algo nesse sentido ao longo do tempo.

Para o Git quase tudo é construído em torno da manipulação esta simples estrutura de quatro diferentes tipos de objeto. É uma espécie de um sistema de arquivos pequeno que roda em cima do sistema de arquivos da sua máquina.

Muito diferente da maioria dos sistemas de SCM que conhecemos e podemos estar familiarizado. Subversion, CVS, Perforce, Mercurial e como eles usam sistemas de armazenamento Delta - eles armazenam as diferenças entre um commit e outro. Git não faz isso - ele grava um instantâneo do que todos os arquivos como ele vê  no repositório, com toda a estrutura de árvore cada vez que faz commit. Este é um conceito muito importante para entender quando usar Git.

 

 

 3.2.6.2 O Objeto Bold "bolha"


A bolha geralmente armazena o conteúdo de um arquivo. Um Objeto "bolha" nada mais é que um pedaço de dados binários. Ele não faz referência a qualquer outra coisa ou tem atributos de qualquer tipo, nem mesmo um nome de arquivo.

 

Uma vez que a bolha é inteiramente definida por seus dados, se dois arquivos em uma árvore de diretórios (ou em várias versões diferentes do repositório) têm o mesmo conteúdo, eles irão compartilhar o mesmo objeto bolha. O objeto é totalmente independente da sua localização na árvore de diretórios e renomear um arquivo não muda o objeto que está associado o arquivo.

 

 

 

3.2.6.3 O Objeto "Arvore"


Uma árvore é um simples objeto que tem um monte de ponteiros para bolhas e outras árvores - que geralmente representa o conteúdo de um diretório ou subdiretório. Um objeto árvore contém uma lista de entradas, cada uma com um modo, tipo de objeto, o nome SHA1, e nome, classificados por nome. Ele representa o conteúdo de uma única árvore de diretórios.

 

Um objeto referenciado por uma árvore pode ser uma bolha, representando o conteúdo de um arquivo, ou outra árvore, representando o conteúdo de uma subdiretório. Desde que as árvores e as bolhas, como todos os outros objetos, são nomeados pelo hash SHA1 de seu conteúdo, duas árvores com o mesmo nome SHA1 se e somente se seu conteúdo (incluindo, recursivamente, o conteúdo de todos os subdiretórios) são idênticos. Isso permite o Git determinar rapidamente as diferenças entre os dois objetos arvore relacionados, pois pode ignorar as entradas com os nomes de objeto idêntico.

 


3.2.6.4 O objeto "commit"


objeto "commit" faz ligações de um estado físico de uma árvore com uma descrição de como chegamos lá e porquê

 


Um commit é definido por:

 

uma árvore: O nome SHA1 de um objeto de árvore, representando o conteúdo de um diretório em um determinado ponto no tempo.

parent(s): O nome SHA1 de algum número de confirmações que são o passo imediatamente anterior (s) na história do projeto. Mesclar commits pode ter mais de um. Um compromisso com nenhum pai é chamada decommit "raiz", e representa a primeira revisão de um projeto. Cada projeto deverá ter pelo menos uma raiz. Um projeto também pode ter múltiplas raízes, embora isso não seja comum (ou necessariamente uma boa ideia).

um autor: O nome da pessoa responsável por essa mudança, juntamente com a sua data.

committer: O nome da pessoa que realmente criou o commit, com a data em que foi feito. Isso pode ser diferente do autor, por exemplo, se o autor escreveu um patch e enviou a uma outra pessoa que utilizou o patch para criar a commit.

um comentário sobre o commit.

 

Devemos notar que um commit, não contendo qualquer informação sobre o que realmente mudou, todas as mudanças são calculadas através da comparação do conteúdo da árvore de que trata este commit com as árvores associadas com seus pais. Em particular, Git não tenta gravar arquivos renomeados de forma explícita, embora se possa identificar os casos em que a existência do arquivo de dados mesmo em caminhos de trocados sugere uma renomeação.

Um commit é normalmente criado por “git commit”, o que cria um compromisso cujo pai é normalmente o chefe atual, e cuja árvore é retirada do conteúdo atualmente armazenado no índice.


 

3.2.6.5 O Objeto Tag


Um objeto tag contém um nome do objeto (chamado simplesmente de "objeto"), tipo de objeto, nome da tag, o nome da pessoa que criou a tag, e uma mensagem, e pode conter uma assinatura.

 

O comando git tag também pode ser usado para criar "tags leves", que não são objetos tag de tudo, mas apenas referências simples cujos nomes começam com "refs/tags/").


 

3.2.6.6 O Diretório Git


O diretório '.git' é o diretório que armazena toda o histórico do Git e meta informação para o seu projeto - incluindo todos os objetos (commit, árvores, bolhas, tags), todas as indicações de onde estão ramos diferentes e muito mais. Existe apenas uma diretório Git por projeto (em oposição a um por subdiretório como com o SVN ou CVS), e este diretório é oculto (por padrão, embora não necessariamente) e fica localizado na raiz do seu projeto.

 

 

 

3.2.6.7 O Diretório de Trabalho


O diretório de trabalho do Git é o diretório que contém uma cópia de todos os arquivos que estamos trabalhando. Arquivos neste diretório são frequentemente removidos ou substituídos pelo Git quando mudamos de ramos e isto é normal. Toda a sua história é armazenado no diretório .Git, o diretório de trabalho é simplesmente um lugar temporário onde podemos modificar os arquivos até o próximo commit.

 


 

3.2.6.8 O índice Git


O índice Git é usado como uma área de teste entre o seu diretório de trabalho e seu repositório. Você pode usar o índice para construir um conjunto de alterações que pretende publicar. Quando você cria um commit, que está publicado e que está no índice, não o que está em seu diretório de trabalho.

 

Olhando para o índice a maneira mais fácil ver o que está no índice é com o comando “git status”. Quando você executar “git status”, você pode ver quais arquivos são marcados (atualmente em seu índice), que são modificados, mas ainda não estão marcados, e que são completamente não monitorados.

 

 

Comments