Git
Chapters ▾ 2nd Edition

1.3 Começando - O Básico do Git

O Básico do Git

Então, o que é o Git em poucas palavras? Esta é uma seção que é importante aprender, porque se tu perceberes o que Git é e os fundamentos de como ele funciona, em seguida, provavelmente será muito mais fácil para ti usares efetivamente o Git. Enquanto estiveres a aprender sobre o Git, tenta esquecer as coisas que possas saber sobre outros VCSs, como Subversion e Perforce; isto vai ajudar-te a evitar a confusão subtil ao usares a ferramenta. Git armazena e vê informações de forma muito diferente do que estes outros sistemas, mesmo que a interface do utilizador seja bastante semelhante, e entender estas diferenças irá ajudar-te a não ficares confuso.

Imagens, Não Diferenças

A principal diferença entre Git e qualquer outro VCS (Subversion e similares) é a maneira Git trata os seus dados. Conceitualmente, a maioria dos outros sistemas armazenam informação como uma lista de mudanças nos arquivos. Estes sistemas (CVS, Subversion, Perforce, Bazaar, e assim por diante) tratam a informação como um conjunto de arquivos e as mudanças feitas a cada arquivo ao longo do tempo (isto é comumente descrito como controle de versão delta-based).

Armazenamento de dados como alterações numa versão básica de cada arquivo.
Figure 4. Armazenando dados como alterações numa versão básica de cada arquivo.

Git não trata nem armazena os seus dados desta forma. Em vez disso, Git trata os seus dados mais como um conjunto de imagens de um sistema de arquivos em miniatura. Toda vez que comprometeres, ou guardares o estado do teu projeto no Git, ele basicamente tira uma foto de todos os teus arquivos e armazena uma referência a esta imagem. Para ser eficiente, se os arquivos não foram alterados, Git não armazena o arquivo novamente, apenas um link para o arquivo idêntico anterior já armazenado. Git trata os seus dados mais como um fluxo de imagens.

[Git armazena dados como imagens do projeto ao longo do tempo.
Figure 5. Armazenando dados como imagens do projeto ao longo do tempo.

Esta é uma diferença importante entre o Git e quase todos os outros VCSs. Isto faz o Git reconsiderar quase todos os aspectos de controle de versão que a maioria dos outros sistemas copiaram da geração anterior. Isto faz com que o Git seja mais como um mini sistema de arquivos com algumas ferramentas incrivelmente poderosas, ao invés de simplesmente um VCS. Vamos explorar alguns dos benefícios que tu ganhas ao tratar os teus dados desta forma quando cobrirmos ramificações no Git Ramificação do Git.

Quase Todas as Operações são Locais

A maioria das operações no Git só precisa de arquivos e recursos locais para operar - geralmente nenhuma informação é necessária de outro computador da rede. Se estiveres acostumado com um CVCS onde a maioria das operações têm aquela demora causada pela latência da rede, este aspecto do Git vai fazer pensares que os deuses da velocidade abençoaram Git com poderes extraterrestres. Como tens toda a história do projeto ali mesmo no teu disco local, a maioria das operações parecem quase instantâneas.

Por exemplo, para pesquisar o histórico do projeto, o Git não precisa sair para o servidor para obter a história e exibi-lo para ti - ele simplesmente lê-lo diretamente da tua base de dados local. Isto significa que tu vês o histórico do projeto quase que instantaneamente. Se quiseres ver as alterações introduzidas entre a versão atual de um arquivo e o arquivo de um mês atrás, Git pode procurar o arquivo de um mês atrás e fazer um cálculo de diferença local, em vez de ter que pedir a um servidor remoto para fazê-lo ou puxar uma versão mais antiga do arquivo do servidor remoto para fazê-lo localmente.

Isto também significa que há muito pouco que tu não podes fazer se estiveres desconectado ou sem VPN. Se estiveres num avião ou num comboio e quiseres trabalhar um pouco, podes comprometer alegremente (para a tua cópia local, lembre-se?) até conseguires conexão da rede e enviar os arquivos. Se chegares a casa e não conseguires conectar ao VPN, ainda poderás trabalhar. Em muitos outros sistemas, isto é impossível ou doloroso. Em Perforce, por exemplo, não podes fazer quase nada se não estiveres conectado ao servidor; e no Subversion e CVS, podes editar os arquivos, mas não poderás comprometer alterações à tua base de dados (porque tu não estás conectado na tua base de dados). Isto pode não parecer muito, mas poderás-te surpreender com a grande diferença que isto pode fazer.

Git Tem Integridade

Tudo no Git passa por uma soma de verificação (checksum) antes de ser armazenado e é referenciado por esta soma. Isto significa que é impossível mudar o conteúdo de qualquer arquivo ou pasta sem que Git saiba. Esta funcionalidade está incorporada no Git nos níveis mais baixos e é parte integrante de sua filosofia. Não perderás informação durante a transferência e não receberás um arquivo corrompido sem que o Git seja capaz de detectár.

O mecanismo que o Git utiliza para esta soma de verificação é chamado um hash SHA-1. Esta é uma seqüência de 40 caracteres composta de caracteres hexadecimais (0-9 e a-f) e é calculada com base no conteúdo de uma estrutura de arquivo ou diretório no Git. Um hash SHA-1 é algo como o seguinte:

24b9da6552252987aa493b52f8696cd6d3b00373

Vais ver estes valores de hash em todo o lugar no Git porque ele os usa com frequência. Na verdade, o Git armazena tudo na sua base de dados não pelo nome do arquivo, mas pelo valor de hash do seu conteúdo.

O Git Geralmente Somente Adiciona Dados

Quando fazes algo no Git, quase sempre são adicionados dados à base de dados do Git - e não removidos. É difícil fazer algo no sistema que não seja reversível ou para fazê-lo apagar dados de forma alguma. Como em qualquer VCS, tu podes perder as alterações que ainda não tenham sido comprometidas; mas depois de comprometer uma imagem no Git, é muito difícil de perdê-la, especialmente se enviares regularmente a tua base de dados para outro repositório.

Isto faz com que o uso do Git seja somente alegria, porque sabemos que podemos experimentar sem o perigo de estragar algo. Para um olhar mais aprofundado de como o Git armazena os seus dados e como tu podes recuperar dados que parecem perdidos, consulta Desfazer Coisas.

Os Três Estados

Agora, presta atenção — Esta é a principal coisa a lembrar sobre Git se quiseres que o resto do teu processo de aprendizagem ocorra sem problemas. O Git tem três estados principais que os teus arquivos podem estar: comprometido, modificados e preparado:

  • Comprometido significa que os dados estão armazenados de forma segura na tua base de dados local.

  • Modificado significa que alteraste o arquivo, mas ainda não o comprometeste à tua base de dados.

  • Preparado significa que marcaste a versão atual de um arquivo modificado para fazer parte do teu próximo comprometimento.

Iso leva-nos a três seções principais de um projeto Git: o diretório Git, o diretório de trabalho e área de preparo.

Diretório de trabalho, área de preparo, e o diretório Git.
Figure 6. Diretório de trabalho, área de preparo, e o diretório Git.

O diretório Git é onde o Git armazena os metadados e a base de dados de objetos do teu projeto. Esta é a parte mais importante do Git, e é o que é copiado quando tu clonas um repositório de outro computador.

O diretório de trabalho é uma simples cópia de uma versão do projeto. Estes arquivos são puxados da base de dados compactado no diretório Git e colocados no disco para os usar ou modificar.

A área de preparo é um arquivo, geralmente contido no teu diretório Git, que armazena informações sobre o que vai entrar no teu próximo comprometimento. É por vezes referido como o “índice”, mas também é comum referir-se a ele como “área de preparo”.

O fluxo de trabalho básico Git é algo assim:

  1. Tu modificas os arquivos no teu diretório de trabalho.

  2. Tu preparas os arquivos, adicionando imagens deles à tua área de preparo.

  3. Tu comprometes, o que leva os arquivos como eles são na área de preparo e armazenas estas imagens de forma permanente para o diretório do Git.

Se uma versão específica de um arquivo está no diretório Git, é considerado comprometido. Se for modificado, mas foi adicionado à área de preparo, é considerado preparado. E se ele for alterado depois de ter sido carregado, mas não foi preparado, ele é considerado modificado. No Noções Básicas do Git, tu vais aprender mais sobre estes estados e como podes tirar proveito deles ou saltar a parte de preparação inteiramente.