Git é uma daquelas ferramentas onde você consegue se virar com uns 15 comandos por anos — e aí um dia você acidentalmente faz rebase da sua branch main e de repente deseja ter aprendido mais alguns. Este cheatsheet é o "mais alguns" sem o ataque de pânico.
Eis algo que ninguém te conta cedo: git é basicamente um grafo acíclico dirigido de snapshots. Cada commit é um snapshot, cada branch é um ponteiro, e HEAD é apenas um post-it dizendo "você está aqui." Uma vez que isso clica, todo o resto — rebasing, cherry-picking, resetting — para de parecer magia negra e começa a parecer mover post-its.
Organizamos tudo por workflow em vez de alfabeticamente, porque ninguém pensa "preciso de um comando que começa com R." Você pensa "preciso desfazer aquele último commit" ou "preciso pegar a branch do meu colega." Comece com Workflow Básico se está começando, depois explore (o trocadilho é totalmente intencional) à medida que fica confortável. As seções de Stash e Reset vão salvar sua pele pelo menos uma vez por semana.
Uma regra de ouro: commit cedo, commit com frequência. Commits pequenos são fáceis de revisar, fáceis de reverter e fáceis de entender daqui a seis meses quando você estiver lendo git log e se perguntando o que o seu eu do passado estava pensando.
Workflow Básico
git init
Criar um novo repositório no diretório atualgit clone <url>
Baixar um repositório e todo seu históricogit status
Mostrar arquivos alterados, staged e untrackedgit add <file>
Adicionar um arquivo específico ao stage para o próximo commitgit add .
Adicionar todas as alterações no diretório atual ao stagegit commit -m "<msg>"
Fazer commit das alterações staged com uma mensagemgit push
Enviar commits locais para o remotegit pull
Buscar e mesclar alterações remotas na sua branch
Branching
git branch
Listar todas as branches locaisgit branch -a
Listar branches locais e remotasgit branch <name>
Criar uma nova branch (mas continuar na atual)git switch <name>
Mudar para uma branch existentegit switch -c <name>
Criar uma nova branch e mudar para elagit branch -d <name>
Deletar uma branch (seguro — bloqueia se não mesclada)git branch -D <name>
Forçar exclusão de uma branch, mesmo se não mescladagit branch -m <new>
Renomear a branch atual
Merge e Rebase
git merge <branch>
Mesclar uma branch na sua branch atualgit merge --no-ff <branch>
Mesclar com um merge commit, mesmo se fast-forward for possívelgit rebase <branch>
Reaplicar seus commits em cima de outra branchgit rebase --abort
Cancelar um rebase em andamento e restaurar o estado originalgit rebase --continue
Continuar o rebase após resolver conflitosgit merge --abort
Cancelar um merge em andamentogit cherry-pick <hash>
Aplicar um único commit de outra branch
Stash
git stash
Guardar temporariamente todas as alterações não commitadasgit stash -u
Fazer stash incluindo arquivos untrackedgit stash pop
Restaurar o stash mais recente e removê-logit stash apply
Restaurar o stash mais recente mas mantê-lo na listagit stash list
Mostrar todos os stashes salvosgit stash drop
Deletar o stash mais recentegit stash drop stash@{n}
Deletar um stash específico por índice
Log e Diff
git log
Mostrar histórico de commits da branch atualgit log --oneline
Histórico compacto de uma linha por commitgit log --graph --oneline
Mostrar histórico de branches como um gráfico ASCIIgit diff
Mostrar alterações não staged vs último commitgit diff --staged
Mostrar alterações staged vs último commitgit diff <branch1> <branch2>
Comparar duas branchesgit show <hash>
Mostrar as alterações de um commit específicogit log -p <file>
Mostrar o histórico completo de alterações de um arquivo
Reset e Revert
git reset <file>
Remover um arquivo do stage mas manter as alteraçõesgit reset HEAD~1
Desfazer último commit, manter alterações stagedgit reset --soft HEAD~1
Desfazer último commit, manter alterações staged (explícito)git reset --hard HEAD~1
Desfazer último commit e descartar todas as alterações permanentementegit revert <hash>
Criar um novo commit que desfaz um commit anteriorgit checkout -- <file>
Descartar alterações não staged de um arquivo específicogit restore <file>
Descartar alterações não staged (sintaxe moderna)git restore --staged <file>
Remover um arquivo do stage (sintaxe moderna)
Remotes
git remote -v
Listar todos os remotes com suas URLsgit remote add <name> <url>
Adicionar um novo repositório remotegit fetch
Baixar alterações remotas sem mesclargit fetch --prune
Buscar e remover branches de rastreamento remoto obsoletasgit pull --rebase
Buscar alterações remotas e reaplicar seu trabalho em cimagit push -u origin <branch>
Enviar uma branch e configurá-la para rastrear o remotegit push origin --delete <branch>
Deletar uma branch remota
Tags
git tag
Listar todas as tagsgit tag <name>
Criar uma tag leve no commit atualgit tag -a <name> -m "<msg>"
Criar uma tag anotada com uma mensagemgit push --tags
Enviar todas as tags locais para o remotegit tag -d <name>
Deletar uma tag localgit push origin --delete <tag>
Deletar uma tag remota
Use git switch e git restore em vez de git checkout. O comando checkout faz coisas demais — switch cuida de branches, restore cuida de arquivos. Intenção mais clara, menos erros.
Execute git pull --rebase em vez de git pull simples para manter seu histórico linear. Melhor ainda, defina como padrão: git config --global pull.rebase true.
Errou a mensagem do último commit? git commit --amend -m "mensagem corrigida" reescreve. Só não faça amend em commits que você já fez push — isso reescreve histórico do qual seus colegas podem depender.
Use git stash -u em vez de git stash simples. A flag -u inclui arquivos untracked, que é quase sempre o que você quer. Sem ela, arquivos novos que você ainda não adicionou ficam para trás.
O git reflog é sua máquina do tempo. Mesmo após um reset --hard ruim, seus commits não desaparecem de verdade por cerca de 30 dias. Execute git reflog, encontre o hash que você quer e git reset --hard <hash> para recuperar.
Antes de um grande merge ou rebase, crie uma "branch de segurança" com git branch backup-antes-do-merge. Se tudo der errado, você sempre pode voltar ao ponto de partida. Seguro barato.
Use git log --oneline --graph --all para visualizar toda a topologia de branches no terminal. É a forma mais rápida de entender o que está acontecendo em um repositório com múltiplas branches ativas.