Git: Introdução ao Git e aos conceitos de controle de versão
O Git é o sistema de controle de versão distribuído mais popular do mundo — ele torna a colaboração em equipe simples e eficiente.
Este tutorial foi elaborado para iniciantes sem experiência prévia. Ele começa com os conceitos básicos do controle de versão e avança até que você se torne proficiente no uso do Git para colaboração em equipe.
1. O que você vai aprender
- Conceitos básicos de controle de versão
- A história e a filosofia de design do Git
- Controle de versão distribuído x centralizado
- As principais vantagens do Git
- Casos de uso do Git
2. O que é controle de versão?
O controle de versão é um sistema que rastreia as alterações no conteúdo dos arquivos, de modo que versões específicas possam ser recuperadas no futuro.
(1) Por que o controle de versão é necessário?
Imagine que você está escrevendo um artigo:
Thesis-v1.doc # First Edition
Thesis-v2.doc # Some content has been revised.
Thesis-Final Version.doc # My advisor said I still need to revise it.
Thesis-Final Version2.doc # Made a few more changes
Thesis-I'll never change the layout.doc # This really is the final version.
Thesis-I'll never change the layout2.doc # All right,Still needs to be revised...
O problema dessa abordagem:
- Nomes de arquivos confusos: Qual deles é a versão final de verdade?
- Falta de rastreabilidade: não fica claro quais alterações foram feitas em cada ocasião
- Sujeito a erros: Você pode ter editado a versão errada do arquivo
- Desafios da colaboração: O que você deve fazer quando várias pessoas estão editando o mesmo arquivo?
Os sistemas de controle de versão foram criados justamente para resolver essas questões.
3. A evolução do controle de versão
(1) 3.1 Controle de versão local
A forma mais antiga de controle de versão consistia em armazenar todas as versões de um arquivo localmente.
graph TB
A[Local Database<br/>v1, v2, v3] --> B[Workspace]
Ferramentas representativas: RCS (Sistema de Controle de Revisões)
Desvantagens: Não há suporte para colaboração entre vários usuários
(2) 3.2 Controle de versão centralizado
Todas as versões do conjunto de dados estão armazenadas em um único servidor. Os membros da equipe baixam os arquivos do servidor, fazem as alterações e, em seguida, os enviam de volta.
graph TB
S[Central Server<br/>All Versions]
S --> A[UserA]
S --> B[UserB]
S --> C[UserC]
Principais ferramentas: CVS, Subversion (SVN), Perforce
Vantagens:
- Fácil de gerenciar, com controle de acesso simples
- Todos podem ver o que os outros estão fazendo
Desvantagens:
- Ponto único de falha: Se o servidor ficar fora do ar, ninguém consegue trabalhar.
- Dependência da Internet: É necessária uma conexão com a Internet para que isso funcione
- Lento: Todas as operações exigem uma solicitação ao servidor
(3) 3.3 Controle de versão distribuído
Todo desenvolvedor possui um repositório completo de controle de versão (repositório) que inclui todo o histórico.
graph LR
A[UserAWarehouse<br/>Complete History] <--> B[UserBWarehouse<br/>Complete History]
B <--> C[UserCWarehouse<br/>Complete History]
A <--> C
Ferramentas representativas: Git, Mercurial, Bazaar
Vantagens:
- Trabalhar offline: Enviar alterações, visualizar o histórico e criar ramificações sem conexão com a internet
- Rápido: A maioria das operações é realizada localmente
- Alta tolerância a desastres: o repositório de cada usuário é um backup completo
- Fluxos de trabalho flexíveis: Oferece suporte a vários modos de colaboração
Desvantagens:
- A clonagem inicial é lenta (é necessário baixar todo o histórico)
- O conceito é relativamente complexo
4. O nascimento do Git
(1) 4.1 As origens do Git
Em 2005, ocorreu um grande acontecimento na comunidade de desenvolvimento do kernel do Linux:
- O projeto do kernel do Linux sempre utilizou o sistema de controle de versão proprietário BitKeeper
- A BitMover, proprietária do BitKeeper, revogou os direitos de uso gratuito
- Linus Torvalds, o fundador do Linux, decidiu desenvolver por conta própria um novo sistema de controle de versão
Objetivos de projeto do Git:
- Velocidade: Deve ser muito rápido
- Simplicidade: O design deve ser simples e elegante
- Suporte ao desenvolvimento não linear: Permite milhares de ramificações paralelas
- Totalmente distribuído: Cada desenvolvedor possui um repositório completo
- Gestão eficiente de projetos de grande porte: como o kernel do Linux
Linus concluiu a versão inicial do Git em abril de 2005, em cerca de duas semanas. Hoje, o Git se tornou o sistema de controle de versão mais popular do mundo.
(2) 4.2 A filosofia de design do Git
O design do Git incorpora vários princípios fundamentais:
Um instantâneo, não as diferenças
Outros sistemas (como o SVN) armazenam as diferenças entre os arquivos:
v1: file.txt (Original Document)
v2: file.txt + diff1 (Storage Differences)
v3: file.txt + diff1 + diff2 (Cumulative Difference)
O Git armazena um instantâneo completo de cada commit:
v1: file.txtA complete snapshot of
v2: file.txtA complete snapshot of
v3: file.txtA complete snapshot of
Vantagens:
- Troca de versão extremamente rápida (lê diretamente os snapshots)
- Criar um branch não custa quase nada (é apenas um ponteiro)
Quase todas as operações são realizadas localmente
- Ver histórico: Local
- Enviar alterações: Local
- Criar um branch: Local
- Mudar de ramificação: Local
Apenas as operações de envio e recebimento exigem conexão com a internet.
5. Conceitos básicos do Git
(1) 5.1 Repositório
Um repositório é um conceito fundamental no Git e inclui:
- Diretório de trabalho: Os arquivos que você está editando no momento
- Área de preparação: Alterações prontas para serem confirmadas
- Repositório: O histórico de todos os commits
graph TB
subgraph GitWarehouse
R[Repository .git<br/>All Commit History<br/>All Branch Information]
S[Buffer Stage<br/>Changes Ready to Be Submitted]
W[Workspace Work<br/>Files Actually Edited]
end
W -->|git add| S
S -->|git commit| R
(2) 5.2 Confirmar
Um commit é a unidade básica do Git e consiste em:
- Snapshot: O estado de todos os arquivos em um determinado momento
- Metadados: Autor, Data, Mensagem do commit, Commit pai
- Identificador único: valor de hash SHA-1 de 40 caracteres
commit a1b2c3d4e5f6... (40Bit Hash)
Author: Zhang San <zhangsan@example.com>
Date: 2024-01-01 10:00:00
Add User Login Functionality
(3) 5.3 Ramificação
Um branch é um ponteiro móvel para um commit. Criar um branch no Git é extremamente simples — basta criar um arquivo de 41 bytes (um hash de 40 bytes mais um caractere de nova linha de 1 byte).
graph LR
C1[SubmitC1] --> C2[SubmitC2] --> C3[SubmitC3]
main[mainBranch] --> C3
feature[featureBranch] --> C3
6. Casos de uso do Git
(1) 6.1 Projetos pessoais
- Histórico de revisões: volte para qualquer versão a qualquer momento
- Experimente novos recursos: crie um branch para testá-los e exclua-o caso não funcionem
- Código de backup: Enviar para o repositório remoto como backup
(2) 6.2 Trabalho em equipe
- Desenvolvimento paralelo: Várias pessoas trabalhando simultaneamente em diferentes ramos
- Revisão de código: Processo de solicitação de pull
- Resolução de conflitos: fusão automática, resolução manual de conflitos
(3) 6.3 Projetos de código aberto
- Fluxo de trabalho de fork: Primeiro faça um fork, depois faça as alterações e, por fim, envie um PR
- Contribuir com código: Envie uma solicitação de pull para o projeto
- Acompanhar o projeto original: Mantenha-se em sincronia com o projeto original
(4) 6.4 Integração Contínua/Implantação Contínua (CI/CD)
- Testes automatizados: os testes são executados automaticamente após o envio do código
- Implantação automática: Implantar automaticamente após o teste ser bem-sucedido
- Lançamento de versão: Marcar e lançar uma nova versão
7. Git x outros sistemas de controle de versão
| Recursos | Git | SVN | CVS |
|---|---|---|---|
| Arquitetura | Distribuída | Centralizada | Centralizada |
| Trabalho offline | ✅ Totalmente compatível | ❌ Não compatível | ❌ Não compatível |
| Criação de ramificação | Muito rápida (O(1)) | Lenta (cópia de diretório) | Não suportada |
| Método de armazenamento | Instantâneo | Diferencial | Diferencial |
| Dependência de rede | Apenas push/pull | Todas as operações | Todas as operações |
| Recuperação de desastres | Alta (backup completo por pessoa) | Baixa (depende do servidor) | Baixa |
▶ Exemplo: Comandos básicos do Git
# InitializationGitWarehouse
git init
# View Repository Status
git status
# Add a file to the staging area
git add .
# Submit Changes
git commit -m "Initial Submission"
# View commit history
git log
❓ Perguntas Frequentes
P: Qual é a relação entre o Git e o GitHub?
R: O Git é uma ferramenta de controle de versão, e o GitHub é uma plataforma de hospedagem de código baseada no Git. É como se o Git fosse um “carro” e o GitHub fosse um “estacionamento” — você pode usar o Git para gerenciar seu código localmente e, em seguida, enviá-lo ao GitHub para hospedagem e colaboração.
P: Por que eu deveria aprender Git?
R: O Git se tornou o padrão do setor. 95% dos desenvolvedores usam o Git, e praticamente todos os projetos de código aberto são gerenciados com o Git. Se você não aprender a usar o Git, não poderá participar de colaborações em equipe nem contribuir com projetos de código aberto.
P: O controle de versão distribuído ocupa muito espaço?
R: O Git utiliza técnicas de compactação e deduplicação, o que o torna altamente eficiente em termos de armazenamento. Por exemplo, o kernel do Linux tem mais de 1 milhão de commits, mas o repositório do Git ocupa apenas cerca de 1 GB.
P: O SVN ainda é usado?
R: Ainda o utilizamos, mas seu uso vem diminuindo ano a ano. O SVN é adequado para gerenciar arquivos binários de grande porte (como recursos de jogos), mas recomendamos o uso do Git para novos projetos.
📖 Resumo
- O controle de versão é um sistema que acompanha as alterações nos arquivos, resolvendo problemas como confusão entre versões e dificuldades de colaboração.
- O controle de versão evoluiu do modelo local para o centralizado e, posteriormente, para o distribuído.
- O Git foi criado por Linus Torvalds em 2005 e foi projetado tendo em mente a velocidade, a simplicidade e a descentralização.
- O Git armazena instantâneos em vez de diferenças, e quase todas as operações são realizadas localmente
- Conceitos básicos do Git: repositórios, commits, ramificações
- O Git é adequado para projetos pessoais, colaboração em equipe, projetos de código aberto, CI/CD e outros cenários
📝 Exercícios
-
Pergunta básica: Explique com suas próprias palavras a diferença entre “controle de versão distribuído” e “controle de versão centralizado”, citando pelo menos três pontos.
-
Pergunta avançada: Pesquise projetos ou empresas da sua região para descobrir quais ferramentas de controle de versão eles utilizam e por que escolheram essas ferramentas.
-
Desafio: Leia o e-mail original de Linus Torvalds sobre o Git (pesquise por “Linus Torvalds Git mailing list”) para conhecer os antecedentes e a filosofia de design por trás da criação do Git.