// Referência Completa

Manual GIT

Do init ao rebase — tudo que você precisa para dominar controle de versão.

10+
Seções
80+
Comandos
Utilidade
⚙️
01 — Fundamentos

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

SistemaComando / Método
Ubuntu / Debiansudo apt install git
macOSbrew install git — ou Xcode CLT
Windowsgit-scm.com/download/win (instalador)
Fedora / RHELsudo dnf install git

Configuração Inicial

SHELL
# 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
📁 Níveis de Config

--global → ~/.gitconfig (todos os projetos)  |  --local → .git/config (projeto atual)  |  --system → /etc/gitconfig (todo o sistema)

💡
02 — Fundamentos

Conceitos Essenciais

O Git armazena snapshots do projeto, não diferenças de arquivos. Entender as três áreas é fundamental.

Working
Directory
arquivos editados
Staging
Area (Index)
git add
Repositório
Local
git commit
Repositório
Remoto
git push

Estados de um Arquivo

untracked

Arquivo existe no diretório mas o Git ainda não o acompanha.

modified

Arquivo rastreado foi alterado mas ainda não foi adicionado ao stage.

staged

Arquivo está na área de staging, pronto para o próximo commit.

committed

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.

🚀
03 — Fundamentos

Iniciando um Repositório

SHELL
# 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
📦
04 — Dia a Dia

Staging & Commits

git add
# 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
git commit
# 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

PrefixoUso
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
✅ Boas Práticas

Commits pequenos e focados. Mensagens no imperativo: "adiciona", não "adicionado". Limite de ~72 caracteres na linha de assunto.

🕰️
05 — Dia a Dia

Histórico & Log

git 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
🌿
06 — Dia a Dia

Branches

Branches são referências leves para commits. Criar e alternar entre elas é instantâneo no Git.

main A──B──C──────────────────G ← v1.0 \ / feature D──E──F ← HEAD
BRANCHES
# 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
🌐
07 — Colaboração

Repositórios Remotos

REMOTE
# 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
⚠️ Atenção

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.

🔀
08 — Colaboração

Merge & Rebase

Merge — preserva o histórico

git merge
# 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

git rebase
# 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
🚫 Regra de Ouro do Rebase

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

git cherry-pick
# 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
⚔️
09 — Colaboração

Resolvendo Conflitos

Conflitos ocorrem quando duas branches editam a mesma parte do mesmo arquivo. O Git marca as diferenças diretamente no arquivo.

CONFLITO — ESTRUTURA
<<<<<<< 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

RESOLUÇÃO
# 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
🗂️
10 — Avançado

Stash — Guardar Mudanças Temporariamente

Use o stash para guardar trabalho inacabado e voltar a um estado limpo sem precisar commitar.

git stash
# 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
🏷️
11 — Avançado

Tags

Tags marcam pontos específicos do histórico, geralmente para versões de release.

git tag
# 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
12 — Avançado

Reset & Revert — Desfazendo Coisas

ModoStagingWorking DirUso
--softmantémmantémVoltar commits, manter tudo staged
--mixed (padrão)limpamantémVoltar commits, manter arquivos
--hardlimpalimpaDescartar tudo DESTRUTIVO
git reset / revert / restore
# ── 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
💾 Reflog é seu Salva-Vidas

O git reflog registra tudo que o HEAD fez. Mesmo após um reset --hard, você pode recuperar commits perdidos com o reflog.

🚫
13 — Avançado

.gitignore

.gitignore — PADRÕES
# 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/
COMANDOS ÚTEIS
# 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
🗺️
14 — Avançado

Fluxos de Trabalho

Git Flow

Fluxo estruturado com branches fixas para projetos com ciclos de release definidos.

main

Código em produção. Nunca commita diretamente aqui.

develop

Integração de features. Base para testes.

feature/*

Novas funcionalidades. Saem de develop, voltam para develop.

release/*

Preparação do release. Merge em main e develop.

hotfix/*

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.

FLUXO DO DIA A DIA
# 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

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