Git: Fundamentos
Git é um sistema de controle de versão distribuído que rastreia mudanças no código ao longo do tempo. GitHub é uma plataforma que hospeda repositórios Git e adiciona ferramentas de colaboração como pull requests e code review.
Conceitos fundamentais
Seção intitulada “Conceitos fundamentais”Repositório
Seção intitulada “Repositório”Um repositório (ou repo) é o diretório do projeto com toda a história de versões armazenada. O histórico fica em uma pasta oculta .git na raiz do projeto.
Há dois tipos:
- Local: na sua máquina
- Remoto: em um servidor (GitHub, GitLab, etc.)
Branches
Seção intitulada “Branches”Uma branch é uma linha independente de desenvolvimento. O trabalho em uma branch não afeta outras até ser mesclado (merge).
main ──●──●──●──────────●── \ /feature/login ────────●──●──●──A branch principal costuma se chamar main (antes era master).
Staging Area
Seção intitulada “Staging Area”Git tem três áreas:
- Working directory - arquivos que você edita
- Staging area (index) - alterações preparadas para o próximo commit
- Repository - histórico de commits
Editar arquivo → git add → git commit(working dir) (staging) (repository)Configuração inicial
Seção intitulada “Configuração inicial”git config --global user.name "Seu Nome"git config --global user.email "seu@email.com"git config --global core.editor "code --wait" # VS Code como editor padrãoComandos essenciais
Seção intitulada “Comandos essenciais”Começar um projeto
Seção intitulada “Começar um projeto”# Iniciar repositório em um diretório existentegit init
# Clonar repositório remotogit clone https://github.com/usuario/repositorio.git
# Clonar em um diretório específicogit clone https://github.com/usuario/repositorio.git meu-projetoVerificar estado
Seção intitulada “Verificar estado”git status # mostra arquivos modificados, staged, untrackedgit log # histórico de commitsgit log --oneline # uma linha por commitgit log --oneline --graph --all # visualizar branchesgit diff # alterações não stagedgit diff --staged # alterações staged (prontas para commit)Registrar alterações
Seção intitulada “Registrar alterações”git add arquivo.java # adiciona arquivo específicogit add src/ # adiciona diretóriogit add . # adiciona tudo no diretório atual
git commit -m "feat: adicionar validação de email"
# Adicionar e commitar em um comando (só arquivos rastreados)git commit -am "fix: corrigir cálculo de imposto"Convenção de mensagens de commit (Conventional Commits):
| Prefixo | Quando usar |
|---|---|
feat: | Nova funcionalidade |
fix: | Correção de bug |
docs: | Documentação |
refactor: | Refatoração sem mudança de funcionalidade |
test: | Adição ou correção de testes |
chore: | Tarefas de manutenção (build, deps) |
Trabalhar com branches
Seção intitulada “Trabalhar com branches”git branch # listar branches locaisgit branch -a # listar locais e remotas
git branch feature/login # criar branchgit checkout feature/login # mudar para branchgit checkout -b feature/login # criar e mudar em um comando
# Forma moderna (Git 2.23+)git switch feature/login # mudar para branchgit switch -c feature/login # criar e mudar
git branch -d feature/login # deletar branch (segura - bloqueia se não mesclada)git branch -D feature/login # deletar branch (forçado)Sincronizar com remoto
Seção intitulada “Sincronizar com remoto”git remote -v # listar remotos configuradosgit remote add origin https://github.com/usuario/repo.git
git push origin feature/login # enviar branch para remotogit push -u origin feature/login # enviar e configurar upstream (primeira vez)git push # enviar para upstream configurado
git pull origin main # buscar e mesclar do remotogit fetch origin # buscar sem mesclargit merge origin/main # mesclar após fetchDesfazer alterações
Seção intitulada “Desfazer alterações”# Descartar alterações no working directorygit restore arquivo.java
# Remover arquivo do staginggit restore --staged arquivo.java
# Reverter commit (cria novo commit que desfaz)git revert abc1234
# Mover HEAD para commit anterior (cuidado com --hard)git reset --soft HEAD~1 # mantém alterações no staginggit reset --mixed HEAD~1 # mantém alterações no working directorygit reset --hard HEAD~1 # descarta alterações permanentementeMerge combina o histórico de duas branches.
git checkout maingit merge feature/loginGit tenta fazer o merge automaticamente. Se houver alterações no mesmo trecho de código em ambas as branches, ocorre um conflito.
Fast-forward merge
Seção intitulada “Fast-forward merge”Quando main não teve commits desde que a branch foi criada, Git apenas avança o ponteiro:
Antes: main ──●──● \ feature ●──●
Depois: main ──●──●──●──●Three-way merge
Seção intitulada “Three-way merge”Quando ambas avançaram, Git cria um commit de merge:
main ──●──●──●──────● \ / feature ────────●──●Resolução de conflitos
Seção intitulada “Resolução de conflitos”Quando duas branches modificam o mesmo trecho de código, Git marca o conflito no arquivo:
<<<<<<< HEAD return saldo - taxa;======= return saldo * (1 - taxa);>>>>>>> feature/calculo-taxaPara resolver:
- Abra o arquivo e edite manualmente para manter o código correto
- Remova os marcadores
<<<<<<<,=======e>>>>>>> - Adicione ao staging e faça commit:
git add arquivo.javagit commit -m "merge: resolver conflito no cálculo de taxa"IDEs como IntelliJ e VS Code têm interfaces visuais para resolução de conflitos que facilitam bastante.
.gitignore
Seção intitulada “.gitignore”O arquivo .gitignore lista padrões de arquivos que o Git deve ignorar:
# Compilados Java*.class*.jartarget/
# Ambientes.env*.local
# IDEs.idea/.vscode/*.iml
# SO.DS_StoreThumbs.dbArquivos já rastreados não são afetados pelo .gitignore. Para parar de rastrear um arquivo:
git rm --cached arquivo-sensivel.env