O Git é a ferramenta mais utilizada para controle de versão no desenvolvimento de software moderno, especialmente em ambientes DevOps. Ele permite rastrear alterações no código, colaborar com equipes e gerenciar versões de forma eficiente. Nesta aula, vamos explorar os conceitos fundamentais do Git e o fluxo básico de trabalho, preparando você para usar essa ferramenta essencial no dia a dia.

Antes de mergulharmos nos comandos, é importante entender por que o controle de versão é crítico para DevOps: ele possibilita automação, integração contínua e entrega contínua (CI/CD), além de garantir rastreabilidade e segurança nas mudanças de código.

Por que controle de versão

O controle de versão é um sistema que registra alterações em um arquivo ou conjunto de arquivos ao longo do tempo, permitindo que você recupere versões específicas posteriormente. Sem ele, você teria que gerenciar manualmente cópias de arquivos (ex: projeto-final-v2-corrigido.js), o que é propenso a erros e ineficiente.

No contexto DevOps, o controle de versão é a base para práticas como Integração Contínua (CI) e Entrega Contínua (CD). Ele permite que múltiplos desenvolvedores trabalhem simultaneamente no mesmo código, mantendo um histórico completo de quem fez o quê e quando. Além disso, facilita a automação de builds, testes e deploys, pois cada versão do código pode ser identificada e reproduzida de forma confiável.

Benefícios principais:

  • Histórico completo de alterações
  • Colaboração eficiente entre equipes
  • Possibilidade de reverter para versões anteriores
  • Ramificação (branching) para desenvolvimento paralelo
  • Integração com ferramentas de CI/CD

Repositório

Um repositório Git (ou repo) é um diretório que contém todos os arquivos do seu projeto, juntamente com todo o histórico de versões armazenado em uma pasta oculta chamada .git. Existem dois tipos principais: repositório local (no seu computador) e repositório remoto (em um servidor como GitHub, GitLab ou Bitbucket).

Para criar um repositório local, use o comando git init dentro do diretório do projeto. Isso cria a estrutura do Git, permitindo que você comece a rastrear alterações. Já um repositório remoto é útil para compartilhar código e colaborar; você pode clonar um repositório remoto com git clone <url>.

Exemplo de criação de repositório local:

mkdir meu-projeto
cd meu-projeto
git init

Após o git init, o diretório .git é criado. Você pode verificar o status do repositório com git status.

Commits

Um commit é um snapshot do seu projeto em um determinado momento. Cada commit possui um identificador único (hash SHA-1), uma mensagem descritiva e metadados como autor e data. Os commits formam um histórico linear (ou ramificado) que permite navegar entre versões.

Para criar um commit, você primeiro adiciona as alterações à área de staging com git add e depois as consolida com git commit. A mensagem do commit deve ser clara e concisa, explicando o que foi alterado.

Exemplo de fluxo de commit:

echo "# Meu Projeto" > README.md
git add README.md
git commit -m "Adiciona README inicial"

O comando git log exibe o histórico de commits. Cada commit é imutável; você pode criar novos commits, mas não alterar os existentes (a menos que use rebase ou force push, com cuidado).

Fluxo básico

O fluxo básico do Git envolve três áreas: diretório de trabalho (working directory), área de staging (index) e repositório (HEAD). O ciclo típico é:

  1. Modificar arquivos no diretório de trabalho.
  2. Adicionar as alterações à área de staging com git add.
  3. Confirmar as alterações com git commit, salvando no repositório.

Para enviar as alterações para um repositório remoto, use git push. Para receber atualizações, use git pull. Esses comandos são a base da colaboração.

Exemplo de fluxo completo com repositório remoto:

# Configurar Git (primeira vez)
git config --global user.name "Seu Nome"
git config --global user.email "email@exemplo.com"

# Clonar repositório remoto
git clone https://github.com/usuario/repo.git
cd repo

# Fazer alterações
echo "Nova linha" >> arquivo.txt

# Adicionar e commitar
git add arquivo.txt
git commit -m "Adiciona nova linha"

# Enviar para remoto
git push origin main

Lembre-se de que main é o nome da branch principal (antigamente master). Sempre verifique o status com git status antes de operações importantes.

Boas práticas

  • Faça commits frequentes e com mensagens significativas.
  • Não commite arquivos binários ou temporários (use .gitignore).
  • Mantenha o repositório limpo: remova arquivos não rastreados antes de commitar.
  • Sempre faça git pull antes de git push para evitar conflitos.
  • Use branches para isolar funcionalidades e corrigir bugs.

Referências

Exercícios

  1. Crie um novo diretório chamado exercicio-git e inicialize um repositório Git dentro dele. Verifique o status do repositório.

    ✓ Resposta:
    mkdir exercicio-git
    cd exercicio-git
    git init
    git status
    

    O comando git init cria o diretório .git. git status deve mostrar que o repositório está vazio (sem commits).

  2. Crie um arquivo index.html com conteúdo básico HTML. Adicione-o à área de staging e faça um commit com a mensagem "Adiciona página inicial".

    ✓ Resposta:
    echo "<!DOCTYPE html><html><head><title>Teste</title></head><body><h1>Olá</h1></body></html>" > index.html
    git add index.html
    git commit -m "Adiciona página inicial"
    
  3. Modifique o arquivo index.html adicionando um parágrafo. Verifique as diferenças com git diff antes de adicionar à staging.

    ✓ Resposta:
    echo "<p>Parágrafo adicionado.</p>" >> index.html
    git diff
    

    O comando git diff mostra as alterações não staged. Depois você pode adicionar e commitar.

  4. Visualize o histórico de commits do repositório. Quantos commits aparecem?

    ✓ Resposta:
    git log --oneline
    

    Se você fez os exercícios anteriores, verá pelo menos 2 commits (o inicial e o da modificação).

  5. Desfaça a última modificação no arquivo index.html (antes de adicionar à staging) usando git checkout ou git restore.

    ✓ Resposta:
    git restore index.html
    

    Ou, em versões mais antigas: git checkout -- index.html. Isso reverte o arquivo ao estado do último commit.