O que é controle de versão?

Concluído

Um VCS (sistema de controle de versão) é um programa ou um conjunto de programas que controla as alterações feitas em uma coleção de arquivos. Uma meta de um VCS é recuperar com facilidade as versões anteriores de arquivos individuais ou do projeto inteiro. Outra meta é permitir que vários membros da equipe trabalhem em um projeto, até mesmo nos mesmos arquivos, simultaneamente sem afetar uns aos outros.

Outro nome para um VCS é sistema de SCM (gerenciamento de configuração de software). Os dois termos geralmente são usados de maneira intercambiável, na verdade, a documentação oficial do Git está localizada em git-scm.com. Tecnicamente, o controle de versão é apenas uma das práticas envolvidas no SCM. Um VCS pode ser usado para projetos além de software, incluindo manuais e tutoriais online.

Com o VCS, você pode:

  • Ver todas as alterações feitas no projeto, quando as alterações foram feitas e quem as fez.
  • Incluir uma mensagem com cada alteração para explicar o raciocínio por trás dela.
  • Recuperar as versões anteriores de todo o projeto ou de arquivos individuais.
  • Criar branches, em que as alterações podem ser feitas de maneira experimental. Esse recurso permite que vários conjuntos diferentes de alterações (por exemplo, recursos ou correções de bug) sejam trabalhados ao mesmo tempo, possivelmente por pessoas diferentes, sem afetar a ramificação principal. Posteriormente, você pode mesclar as alterações que deseja manter na ramificação principal.
  • Anexar uma marca a uma versão, por exemplo, para marcar uma nova versão.

O Git é um VCS rápido, versátil, altamente escalonável, gratuito e de software livre. O autor principal é Linus Torvalds, o criador do Linux.

Controle de versão distribuído

As instâncias anteriores dos VCSs, como o CVS, o Subversion (SVN) e o Perforce, usavam um servidor centralizado para armazenar o histórico de um projeto. Essa centralização significava que o único servidor também era, potencialmente, um ponto único de falha.

O Git é distribuído, o que significa que o histórico completo de um projeto é armazenado no cliente e no servidor. Você pode editar arquivos sem uma conexão de rede, verificá-los localmente e sincronizá-los com o servidor quando uma conexão fica disponível. Se um servidor ficar inativo, você ainda terá uma cópia local do projeto. Tecnicamente, você nem precisa ter um servidor. As alterações podem ser passadas por email ou compartilhadas por uma mídia removível, mas ninguém usa o Git dessa maneira na prática.

Terminologia do Git

Para entender o Git, você precisa entender a terminologia. Veja a seguir uma breve lista dos termos usados com frequência pelos usuários do Git. Não se preocupe com os detalhes por enquanto. Todos esses termos passarão a ser conhecidos à medida que você trabalhar com os exercícios deste módulo.

  • Árvore de trabalho: o conjunto de diretórios e arquivos aninhados que contém o projeto no qual está sendo feito o trabalho.

  • Repositório: o diretório, localizado no nível superior de uma árvore de trabalho, no qual o Git mantém todo o histórico e os metadados de um projeto. Os repositórios são quase sempre chamados de repositórios. Um repositório simples é aquele que não faz parte de uma árvore de trabalho; ele é usado para compartilhamento ou backup. Geralmente, um repositório simples é um diretório com um nome que termina com .git, por exemplo, project.git.

  • Hash: um número produzido por uma função de hash que representa o conteúdo de um arquivo ou de outro objeto como um número fixo de dígitos. O Git usa hashes que têm 160 bits de comprimento. Uma vantagem de usar hashes é que o Git pode informar se um arquivo foi alterado pelo hash do conteúdo e pela comparação do resultado com o hash anterior. Se o carimbo de data/hora do arquivo for alterado, mas o hash do arquivo não, o Git saberá que o conteúdo do arquivo não foi alterado.

  • Objeto: um repositório Git contém quatro tipos de objetos, cada um exclusivamente identificado por um hash SHA-1. Um objeto de blob contém um arquivo comum. Um objeto de árvore representa um diretório; ele contém nomes, hashes e permissões. Um objeto de commit representa uma versão específica da árvore de trabalho. Uma marca é um nome anexado a um commit.

  • Commit: quando usado com o verbo fazer, commit significa fazer um objeto de commit. Essa ação recebe o nome dos commits feitos em um banco de dados. Isso significa que você está fazendo commit das alterações feitas, de modo que outras pessoas possam acabar vendo-as também.

  • Branch: um branch é uma série nomeada de commits vinculados. O commit mais recente em um branch é chamado de principal. A ramificação padrão, que é criada quando você inicializa um repositório, é chamada de main, em geral com o nome master no Git. O principal do branch atual é chamado de HEAD. Os branches são um recurso incrivelmente útil do Git, pois permitem que os desenvolvedores trabalhem de modo independente (ou em conjunto) nos branches e, posteriormente, mesclem as alterações no branch padrão.

  • Repositório remoto: um repositório remoto é uma referência nomeada a outro repositório Git. Quando você cria um repositório, o Git cria um repositório remoto chamado origin, que é o repositório remoto padrão das operações de push e pull.

  • Comandos, subcomandos e opções: as operações do Git são executadas por meio de comandos como git push e git pull. git é o comando e push ou pull é o subcomando. O subcomando especifica a operação que você deseja que o Git execute. Os comandos são frequentemente acompanhados por opções, que usam hifens (-) ou hifens duplos (--). Por exemplo, git reset --hard.

Esses e outros termos, como push e pull, farão mais sentido em breve. Porém, você precisa começar de algum lugar e talvez ache útil voltar e examinar este glossário de termos depois de concluir o módulo.

A linha de comando do Git

Várias GUIs diferentes estão disponíveis para o Git, incluindo o GitHub Desktop. Muitos editores de programação, como o Microsoft Visual Studio Code, também têm uma interface para o Git. Todos eles funcionam de maneira diferente e têm diferentes limitações. Nenhum deles implementa todas as funcionalidades do Git.

Os exercícios deste módulo usam a linha de comando do Git, especificamente, os comandos do Git executados no Azure Cloud Shell. No entanto, a interface de linha de comando do Git funciona da mesma forma, seja qual for o sistema operacional que você esteja usando. Além disso, a linha de comando permite que você explore todas as funcionalidades do Git. Os desenvolvedores que veem o Git somente por meio de uma GUI, às vezes, se deparam com mensagens de erro que não podem resolver e precisam recorrer à linha de comando para continuar trabalhando.

Git e GitHub

À medida que você trabalha com o Git, talvez se pergunte qual são as diferenças entre os recursos oferecidos por ele e os oferecidos pelo GitHub.

Como mencionado anteriormente, o Git é um DVCS (sistema de controle de versão distribuído) que pode ser usado por vários desenvolvedores e outros colaboradores para trabalhar em um projeto. Ele fornece um modo de trabalhar com um ou mais branches locais e os envia por push para um repositório remoto.

O GitHub é uma plataforma de nuvem que usa o Git como sua tecnologia principal. O GitHub simplifica o processo de colaboração em projetos e fornece um site, mais ferramentas de linha de comando e um fluxo geral que pode ser usado pelos desenvolvedores e pelos usuários para trabalhar juntos. O GitHub funciona como o repositório remoto mencionado anteriormente.

Os principais recursos fornecidos pelo GitHub incluem:

  • Problemas
  • Discussões
  • Solicitações de pull
  • Notificações
  • Rótulos
  • Ações
  • Garfos
  • Projetos

Para saber mais sobre o GitHub, confira o módulo do Microsoft Learn Introdução ao GitHub ou a documentação de ajuda Introdução ao GitHub.

A próxima etapa é experimentar o Git.