Instalação & Configuração
Antes de usar o Git, instale-o no seu sistema e configure sua identidade. Essas informações serão registradas em cada commit.
Instalação
| Sistema | Comando / Método |
|---|---|
| Ubuntu / Debian | sudo apt install git |
| macOS | brew install git — ou Xcode CLT |
| Windows | git-scm.com/download/win (instalador) |
| Fedora / RHEL | sudo dnf install git |
Configuração Inicial
# Identidade (obrigatório)
git config --global user.name "Seu Nome"
git config --global user.email "email@exemplo.com"
# Editor padrão
git config --global core.editor vim
git config --global core.editor "code --wait" # VS Code
# Branch padrão
git config --global init.defaultBranch main
# Alias úteis
git config --global alias.st status
git config --global alias.lg "log --oneline --graph --decorate"
# Ver todas as configurações
git config --list
--global → ~/.gitconfig (todos os projetos) | --local → .git/config (projeto atual) | --system → /etc/gitconfig (todo o sistema)
Conceitos Essenciais
O Git armazena snapshots do projeto, não diferenças de arquivos. Entender as três áreas é fundamental.
Directory
Area (Index)
Local
Remoto
Estados de um Arquivo
Arquivo existe no diretório mas o Git ainda não o acompanha.
Arquivo rastreado foi alterado mas ainda não foi adicionado ao stage.
Arquivo está na área de staging, pronto para o próximo commit.
Snapshot salvo permanentemente no histórico do repositório.
O que é HEAD?
O HEAD é um ponteiro especial que indica o commit atual (ou branch atual). É o ponto de onde novas mudanças partem. Quando está detached, aponta diretamente para um commit, não para uma branch.
Iniciando um Repositório
# Criar novo repositório na pasta atual
git init
# Criar repositório em uma pasta específica
git init meu-projeto
# Clonar repositório existente
git clone https://github.com/usuario/repo.git
# Clonar com outro nome local
git clone https://github.com/usuario/repo.git meu-nome
# Clonar apenas a branch específica
git clone -b develop https://github.com/usuario/repo.git
# Clonar com profundidade limitada (mais rápido)
git clone --depth 1 https://github.com/usuario/repo.git
# Ver status do repositório
git status
git status -s # formato curto
Staging & Commits
# Adicionar arquivo específico
git add arquivo.txt
# Adicionar todos os arquivos modificados/novos
git add .
# Adicionar todos os arquivos rastreados (não novos)
git add -u
# Adicionar interativamente (escolher partes do arquivo)
git add -p arquivo.txt
# Remover do stage (manter alterações no disco)
git restore --staged arquivo.txt
# Commit com mensagem inline
git commit -m "feat: adiciona página de login"
# Add + commit de arquivos rastreados
git commit -am "fix: corrige bug no formulário"
# Alterar o último commit (mensagem ou arquivos)
git commit --amend
git commit --amend -m "nova mensagem"
# Commit vazio (útil para CI triggers)
git commit --allow-empty -m "ci: trigger pipeline"
# Ver diferenças antes de commitar
git diff # working dir vs stage
git diff --staged # stage vs último commit
git diff main..feature # entre branches
Conventional Commits
| Prefixo | Uso |
|---|---|
| feat: | Nova funcionalidade |
| fix: | Correção de bug |
| docs: | Apenas documentação |
| style: | Formatação, sem mudança de lógica |
| refactor: | Refatoração sem feature ou fix |
| test: | Adição ou correção de testes |
| chore: | Manutenção, build, CI |
| perf: | Melhoria de performance |
Commits pequenos e focados. Mensagens no imperativo: "adiciona", não "adicionado". Limite de ~72 caracteres na linha de assunto.
Histórico & Log
# Log padrão
git log
# Uma linha por commit
git log --oneline
# Gráfico de branches
git log --oneline --graph --decorate --all
# Últimos N commits
git log -5
# Por autor
git log --author="Nome"
# Por data
git log --since="2024-01-01" --until="2024-12-31"
# Buscar por texto na mensagem
git log --grep="login"
# Commits que tocaram em um arquivo
git log --follow src/app.js
# Ver o que mudou em cada commit
git log -p
# Estatísticas de mudança
git log --stat
# Ver commit específico
git show abc1234
# Quem alterou cada linha de um arquivo
git blame arquivo.txt
Branches
Branches são referências leves para commits. Criar e alternar entre elas é instantâneo no Git.
# Listar branches locais
git branch
# Listar todas (locais + remotas)
git branch -a
# Criar branch
git branch feature/login
# Criar e trocar para nova branch
git checkout -b feature/login
git switch -c feature/login # forma moderna
# Trocar de branch
git checkout main
git switch main # forma moderna
# Renomear branch atual
git branch -m novo-nome
# Deletar branch (seguro)
git branch -d feature/login
# Deletar branch (forçar)
git branch -D feature/login
# Ver qual branch cada commit pertence
git branch --contains abc1234
# Branches já mergeadas em main
git branch --merged main
Repositórios Remotos
# Ver remotos configurados
git remote -v
# Adicionar remoto
git remote add origin https://github.com/usuario/repo.git
# Renomear remoto
git remote rename origin upstream
# Remover remoto
git remote remove origin
# Alterar URL do remoto
git remote set-url origin git@github.com:usuario/repo.git
# ── FETCH / PULL / PUSH ──
# Baixar mudanças sem merge
git fetch origin
git fetch --all # todos os remotos
# Baixar e integrar (fetch + merge)
git pull
git pull origin main
git pull --rebase # pull com rebase em vez de merge
# Enviar para remoto
git push origin main
git push -u origin feature/login # -u define upstream
git push --force-with-lease # push forçado seguro
# Deletar branch remota
git push origin --delete feature/login
# Enviar todas as tags
git push --tags
Prefira --force-with-lease ao invés de --force. Ele verifica se o remoto não teve mudanças desde seu último fetch, evitando sobrescrever o trabalho de outros.
Merge & Rebase
Merge — preserva o histórico
# Merge da feature na main
git checkout main
git merge feature/login
# Merge sem fast-forward (cria commit de merge)
git merge --no-ff feature/login
# Squash: condensa commits da branch em um só
git merge --squash feature/login
git commit -m "feat: implementa login completo"
# Abortar merge em andamento
git merge --abort
Rebase — histórico linear
# Rebase da feature sobre main
git checkout feature/login
git rebase main
# Rebase interativo: editar, squash, reorder os últimos N commits
git rebase -i HEAD~3
git rebase -i main
# Continuar após resolver conflitos
git rebase --continue
# Pular commit com conflito
git rebase --skip
# Abortar rebase
git rebase --abort
Nunca faça rebase de commits que já foram enviados para um repositório público/compartilhado. O rebase reescreve o histórico e causará conflitos para outros colaboradores.
Cherry-pick — copiar commit específico
# Aplicar um commit específico na branch atual
git cherry-pick abc1234
# Aplicar range de commits
git cherry-pick abc1234..def5678
# Sem criar commit (apenas aplica as mudanças)
git cherry-pick -n abc1234
Resolvendo Conflitos
Conflitos ocorrem quando duas branches editam a mesma parte do mesmo arquivo. O Git marca as diferenças diretamente no arquivo.
<<<<<<< HEAD (versão da branch atual)
function login() {
return authenticate(user);
}
=======
function login() {
return verifyUser(user, token);
}
>>>>>>> feature/login (versão que está vindo)
Passo a Passo
# 1. Ver arquivos em conflito
git status
# 2. Usar ferramenta visual de merge
git mergetool
# 3. Editar manualmente e remover marcadores
# Manter apenas o código desejado
# 4. Marcar como resolvido
git add arquivo-resolvido.js
# 5. Continuar merge
git merge --continue
# ou finalizar com commit
git commit
# Optar por uma versão inteira (ours / theirs)
git checkout --ours arquivo.txt
git checkout --theirs arquivo.txt
Stash — Guardar Mudanças Temporariamente
Use o stash para guardar trabalho inacabado e voltar a um estado limpo sem precisar commitar.
# Guardar mudanças (tracked files)
git stash
# Guardar com mensagem descritiva
git stash push -m "WIP: formulário de cadastro"
# Incluir arquivos não rastreados
git stash push -u
# Listar stashes
git stash list
# Aplicar e remover o stash mais recente
git stash pop
# Aplicar sem remover da lista
git stash apply stash@{2}
# Ver o que está em um stash
git stash show -p stash@{0}
# Criar branch a partir do stash
git stash branch nova-branch stash@{0}
# Remover stash específico
git stash drop stash@{1}
# Limpar todos os stashes
git stash clear
Tags
Tags marcam pontos específicos do histórico, geralmente para versões de release.
# Listar tags
git tag
git tag -l "v1.*" # filtrar por padrão
# Tag leve (apenas referência)
git tag v1.0.0
# Tag anotada (recomendada — inclui metadata)
git tag -a v1.0.0 -m "Release versão 1.0.0"
# Taguear commit específico
git tag -a v1.0.0 abc1234
# Ver informações da tag
git show v1.0.0
# Enviar tag para remoto
git push origin v1.0.0
git push origin --tags # todas as tags
# Deletar tag local
git tag -d v1.0.0
# Deletar tag remota
git push origin --delete v1.0.0
# Checkout em uma tag (detached HEAD)
git checkout v1.0.0
Reset & Revert — Desfazendo Coisas
| Modo | Staging | Working Dir | Uso |
|---|---|---|---|
| --soft | mantém | mantém | Voltar commits, manter tudo staged |
| --mixed (padrão) | limpa | mantém | Voltar commits, manter arquivos |
| --hard | limpa | limpa | Descartar tudo DESTRUTIVO |
# ── RESET ──
# Voltar ao commit anterior (mantém arquivos)
git reset --soft HEAD~1
# Voltar 2 commits, manter arquivos fora do stage
git reset HEAD~2
# Descartar completamente os últimos 3 commits
git reset --hard HEAD~3
# ── REVERT ── (cria novo commit que desfaz)
# Revert seguro — não reescreve histórico
git revert abc1234
git revert HEAD~2..HEAD # reverter range
# ── RESTORE ── (descartar mudanças)
# Descartar mudanças no working dir
git restore arquivo.txt
# Remover do stage
git restore --staged arquivo.txt
# Restaurar arquivo de outro commit/branch
git restore --source main arquivo.txt
# ── REFLOG — Recuperar commits "perdidos" ──
git reflog
git checkout abc1234 # recuperar estado anterior
O git reflog registra tudo que o HEAD fez. Mesmo após um reset --hard, você pode recuperar commits perdidos com o reflog.
.gitignore
# Ignorar arquivo específico
segredo.env
# Ignorar extensão
*.log
*.tmp
# Ignorar pasta
node_modules/
dist/
.cache/
# Ignorar em qualquer lugar
**/*.pyc
# Negar regra anterior (incluir mesmo que ignore)
!importante.log
# Ignorar pasta mas não subpastas
/build
# Padrões comuns
.env
.DS_Store
Thumbs.db
__pycache__/
.idea/
.vscode/
# Verificar se um arquivo está sendo ignorado
git check-ignore -v arquivo.txt
# Remover arquivo do tracking sem deletar do disco
git rm --cached arquivo.txt
git rm --cached -r pasta/
# Limpar arquivos não rastreados
git clean -n # dry run — ver o que seria removido
git clean -fd # remover arquivos e pastas
Fluxos de Trabalho
Git Flow
Fluxo estruturado com branches fixas para projetos com ciclos de release definidos.
Código em produção. Nunca commita diretamente aqui.
Integração de features. Base para testes.
Novas funcionalidades. Saem de develop, voltam para develop.
Preparação do release. Merge em main e develop.
Correções urgentes em produção. Saem de main.
GitHub Flow
Fluxo simples para deploy contínuo: main sempre estável → cria branch → abre PR → review → merge → deploy.
# 1. Atualizar main
git checkout main
git pull origin main
# 2. Criar branch de feature
git switch -c feature/minha-feature
# 3. Desenvolver e commitar
git add .
git commit -m "feat: minha feature"
# 4. Rebase na main atualizada
git fetch origin
git rebase origin/main
# 5. Push e abrir Pull Request
git push -u origin feature/minha-feature
# 6. Após merge do PR, limpar
git checkout main
git pull
git branch -d feature/minha-feature
Comandos de Diagnóstico
# Verificar integridade do repositório
git fsck
# Otimizar repositório
git gc
# Encontrar commit que introduziu um bug
git bisect start
git bisect bad # commit atual tem o bug
git bisect good v1.0.0 # versão sem o bug
# Git faz checkout automático, teste e marque:
git bisect good # ou git bisect bad
git bisect reset # finalizar
# Ver tamanho de cada objeto
git count-objects -vH