DevOps: Versionamento de código com Git/Github

Se você pretende trabalhar em sistemas grandes, complexos, colaborativos ou profissionais, o controle de versão não é uma opção, mas uma pré-condição para o sucesso da proposta. Neste artigo, exploraremos os conceitos e a prática por trás do sistema Git e das plataformas de hospedagem. Não apenas exploraremos as ferramentas, mas entenderemos a filosofia por trás do controle de versões e os passos fundamentais para estabelecer seu fluxo de trabalho profissional.

Versionamento de código

O versionamento de código, ou Controle de Versão (Version Control System – VCS), é o processo de gerenciar e rastrear alterações no código-fonte ao longo do tempo. Como define Pressman e Maxim (2021), o controle de versão é um conjunto de processos e ferramentas que permite a uma equipe de software gerenciar as mudanças nos artefatos produzidos.

Características fundamentais

As principais características do versionamento de código são:

  • a capacidade de retornar a qualquer estado anterior do projeto por meio do histórico.
  • a opção de rastreabilidade, ou seja, saber exatamente quem alterou o quê e por quê.
  • a possibilidade de ramificação (branching), com a criação de linhas de desenvolvimento paralelas sem afetar o código principal.

Benefícios e Trade-offs

A partir das capacidades básicas para sistemas de controle de versão de código, percebemos que a segurança contra perda de dados, a facilidade em desfazer erros catastróficos e o suporte nativo ao desenvolvimento em equipe são grandes benefícios na argumentação para adotar-se um VCS. Em contrapartida, utilizar os conceitos de versionamento exige uma curva de aprendizado inicial e disciplina rigorosa da equipe para manter o histórico limpo e as mensagens de commit semânticas.

E o que é o Git?

Criado em 2005 por Linus Torvalds (o pai do Linux), o Git é um sistema de controle de versão distribuído (DVCS). Diferente dos sistemas centralizados antigos (como o SVN), no Git, cada desenvolvedor possui uma cópia completa do repositório, incluindo todo o histórico, em sua máquina local.

De acordo com Loeliger e McCullough (2012), o Git foi projetado com foco em velocidade, integridade de dados e suporte a fluxos de trabalho não lineares e distribuídos. Ele utiliza o algoritmo de hash SHA-1 para garantir que nada seja alterado sem que o Git saiba, garantindo a integridade. Além disso, o Git armazena o estado dos arquivos como “fotos” do sistema e não apenas as diferenças entre eles (snapshots). Por fim, com as operações locais, a maioria das operações não exige conexão com a internet.

Então, o que é o Github?

É bastante comum que estudantes confundam Git com GitHub. Enquanto o Git é a ferramenta de versionamento, o GitHub é uma plataforma de hospedagem de código que utiliza o Git. Ele funciona como uma rede social para desenvolvedores, oferecendo interfaces gráficas e ferramentas de colaboração que o Git puro não possui nativamente.

O GitHub é o maior repositório de projetos open source do mundo. Logo, a comunidade dev existente na plataforma é gigante. Ele oferece a possibilidade para que pessoas contribuam com códigos por meio de pull requests (PRs), que é o mecanismo para revisão de código por pares. Também é possível automatizar processos de CI/CD com o Github Actions, além de várias outras funcionalidades.

Alternativas ao Github

Apesar da dominância do GitHub, o mercado utiliza outras ferramentas dependendo das necessidades de infraestrutura e custos. Uma das opções mais utilizadas é o Bitbucket, que pertence à Atlassian (mesma dona do Jira e Trello). O sistema deles é a escolha comum em ambientes corporativos que já utilizam o ecossistema Atlassian para gerenciamento de projetos.

Por outro lado, também existe o GitLab, que costuma ser muito apreciado por empresas e instituições de ensino que desejam hospedar seus próprios servidores (self-managed). A plataforma possui um ecossistema de Integração Contínua e Entrega Contínua (CI/CD) extremamente robusto e integrado.

Instalando e iniciando o Git local

Para iniciar no mundo do versionamento, o primeiro passo é a instalação e configuração da sua identidade.

Passo 1: Instalação

Baixe o instalador no site oficial git-scm.com conforme sua versão de sistema operacional (Windows, Mac e Linux). Após instalar, verifique no terminal se o Git foi instalado usando o comando:

git --version

Caso apareça qualquer resposta diferente de um número com a versão do programa, ocorreu algum erro na instalação e você deverá tentar novamente.

Passo 2: Configuração de Identidade

Concluída a instalação, vamos identificar o usuário da máquina. Esse passo é crucial para que seus commits – um “snapshot” ou registro permanente das alterações feitas em arquivos de um projeto, identificado por um hash único – sejam atribuídos corretamente a você. Para isso, utilize os comandos:

git config --global user.name "Seu Nome"
git config --global user.email "seuemail@exemplo.com"

Passo 3: Iniciando um Repositório

Agora, por meio do terminal, navegue até a pasta do seu projeto e execute:

git init

Este comando cria uma pasta oculta .git que cria o repositório capaz de rastrear todas as mudanças a partir de agora. Agora, você já tem um versionamento de código em sua máquina/projeto (local).

Adicionando um repositório remoto do Github ao Git Local

Uma vez que o versionamento local está configurado e funcionando, é uma boa prática sincronizar o trabalho com a nuvem (servidor de hospedagem) para garantir a disponibilidade dos códigos caso aconteça algum problema na máquina. Para isso, você pode escolher o Github, o Gitlab ou o Bitbucket. Aqui, seguiremos com o Github por considerá-lo a plataforma mais utilizada por devs ao redor do mundo.

Para sincronizar o trabalho local com o GitHub, precisamos conectar os repositórios local (máquina do usuário) e remoto (Github). Podemos fazer isto por meio do terminal de SO ou da interface gráfica, conhecida como Git GUI.

Primeiro, crie um repositório vazio no GitHub, conforme a Figura 1. Defina o nome do repositório (de preferência com letras minúsculas, sem espaço, sem acentos e o mais curto possível), a visibilidade do repositório na plataforma (Public ou Private) e se você deseja adicionar algum arquivo por padrão (README, gitignore e licença). Escolha “Não” em todos os arquivos iniciais para facilitar o envio do repositório local.

Figura 1 – Criando e definindo o repositório remoto no Github.
Fonte: Autoria própria.

Quando o repositório estiver criado, procure pela URL dele e a copie (ex: https://github.com/usuario/projeto.git). Na Figura 2 temos o exemplo de onde encontrar a informação.

Figura 2 – Exemplo de URL do repositório remoto no github.
Fonte: Autoria própria.

Em seguida, no terminal da máquina, digite o comando abaixo e adicione a URL copiada. Mas, tome cuidado para verificar se o terminal está na pasta correta, ok? O terminal precisa estar no mesmo diretório onde você criou o repositório local. Por exemplo, se você criou um repositório Git na pasta Downloads, mas seu terminal está na pasta Documentos, ele não está apontando para o repositório local. Logo, a associação entre repositórios não funcionará. Fique atento!

git remote add origin https://github.com/usuario/projeto.git

Se não houver mensagem após o comando, está tudo bem! Isso significa que ele funcionou. Uma vez conectados os repositórios, podemos fazer nosso primeiro envio. Com os comandos abaixo, adicionamos os arquivos novos ou modificados ao rastreamento do Git local (add .), depois adicionamos ao commit (commit -m "Texto indicando o que tem no commit"), definimos a branch (branch -M main) e enviamos para a nuvem (Github) com o comando push -u.

git add .
git commit -m "Initial commit: Estrutura base do projeto"
git branch -M main
git push -u origin main

Se tudo correu bem, você verá mensagens indicando quantos arquivos foram enviados, o tempo, o hash do commit dentre outras informações. Caso tenha ocorrido algum erro, você será informado pelo próprio Git no terminal e deverá buscar a solução.

Antes de encerrar, algumas observações:

  1. Os mais atentos à leitura deste artigo perceberam que na Figura 2 existem os códigos que descrevemos aqui. Sim, é isso mesmo. Quando você cria um repositório vazio no Github, ele te explica como sincronizar repositórios e enviar arquivos para ele. Basta seguir as instruções.
  2. Todos os comandos são precedidos pela palavra git.
  3. Adotamos os nomes padrão das coisas no git (origin e main, por exemplo), que poderiam ser outros. Inclusive, há a possibilidade de criar-se outras branchs com nomes escolhidos pelos usuários; mas isso fica para outro artigo.
  4. Para maiores detalhes dos comandos vistos (e dos não vistos), recomendamos a leitura das páginas Git Reference (clique aqui) e Git Cheat Sheet (clique aqui), ambas oficiais.

Conclusão

Dominar o Git é como aprender a ler e escrever para um engenheiro de software. É a ferramenta que permite errar com segurança e colaborar com eficiência. Lembre-se: o código que você escreve hoje é um patrimônio, e o controle de versão é o cofre que o protege.

Espero que este artigo tenha sido uma base para que você continue seus estudos. O domínio dessas ferramentas separará você dos amadores no mercado de trabalho.

Obrigado pela leitura e bons estudos!

Referências

LOELIGER, Jon; MCCULLOUGH, Matthew. Version Control with Git. 2. ed. Sebastopol: O’Reilly Media, 2012.

PRESSMAN, Roger S.; MAXIM, Bruce R. Engenharia de Software: uma abordagem profissional. 9. ed. Porto Alegre: AMGH, 2021.

SOMMERVILLE, Ian. Engenharia de Software. 10. ed. São Paulo: Pearson Education do Brasil, 2018.