Git Cheat Sheet
Comandos, flags, exemplos e erros comuns
Configuração
Lê ou define opções de configuração do Git em três níveis: sistema, utilizador (global) ou repositório (local).
git config --global user.name "John Doe" git config --global user.email "john.doe@example.com"
Define como o Git memoriza credenciais HTTPS para não pedir password a cada push.
git config --global credential.helper manager
Define um .gitignore global aplicado a todos os repositórios.
git config --global core.excludesfile ~/.gitignore_global
Repositórios
Cria um repositório Git novo no directório actual.
git init git init --initial-branch=main meu-projeto
Copia um repositório remoto para a máquina local com toda a história.
git clone https://github.com/user/repo.git
Stage e commit
Mostra o estado da working directory e do staging: o que está modificado, staged ou untracked.
git status
Move alterações da working directory para o staging area, preparando-as para o próximo commit.
git add src/components/Button.tsx git add .
Grava o conteúdo do staging num novo commit do repositório local com uma mensagem.
git commit -m "feat: adiciona git cheat sheet"
Restaura ficheiros: tira do staging ou desfaz alterações na working directory.
git restore --staged file.txt git restore file.txt
Remove ficheiros do repositório (e opcionalmente do disco).
git rm secret.env
Renomeia ou move um ficheiro tracked, equivalente a mv + git add + git rm.
git mv old.tsx new.tsx
Branches
Lista, cria, renomeia ou apaga branches.
git branch git branch feature/login
Comando antigo para mudar de branch ou repor ficheiros. Hoje recomenda-se git switch e git restore.
git checkout main git checkout -b feature/x
Versão moderna do checkout só para mudar de branch.
git switch main git switch -c feature/login
Merge e rebase
Junta as alterações de outra branch na actual, criando um commit de merge se necessário.
git switch main git merge feature/login
Reaplica os commits da branch actual por cima de outra base, reescrevendo a história.
git switch feature git rebase main
Aplica um commit específico de outra branch na actual.
git cherry-pick a1b2c3d
Abre uma ferramenta gráfica para resolver conflitos de merge.
git mergetool --tool=meld
Remote
Gere os remotos do repositório (origin, upstream, etc).
git remote -v
Descarrega commits e refs do remoto sem os integrar na branch local.
git fetch origin
Equivale a git fetch seguido de git merge (ou rebase) na branch actual.
git pull origin main
Envia commits locais para o remoto.
git push -u origin feature/login
Stash
Guarda alterações não commitadas numa pilha temporária para limpar a working directory.
git stash push -m "WIP login"
Manipulação da pilha de stashes.
git stash list git stash pop
Tags
Cria, lista, apaga ou verifica tags. As tags marcam pontos no histórico (releases).
git tag -a v1.2.0 -m "Release 1.2"
Devolve um nome legível baseado na tag mais próxima.
git describe --tags --always --dirty
Log
Mostra o histórico de commits com filtros e formatação flexíveis.
git log --oneline --graph --decorate --all
Mostra o conteúdo de um commit, tag ou objecto.
git show HEAD git show a1b2c3d:src/file.tsx
Mostra diferenças entre working dir, staging, commits ou branches.
git diff git diff --cached git diff main feature
Mostra quem alterou cada linha de um ficheiro e em que commit.
git blame -L 10,30 file.tsx
Resumo agrupado por autor (útil para release notes).
git shortlog -sne
Histórico local de tudo o que o HEAD tocou. Salva-vidas para recuperar commits perdidos.
git reflog
git reset --hard HEAD@{2}Desfazer
Move HEAD para outro commit, opcionalmente alterando staging e working dir.
git reset --soft HEAD~1 git reset --mixed HEAD~1 git reset --hard HEAD~1
Cria um novo commit que desfaz as alterações de outro. Seguro em branches partilhadas.
git revert a1b2c3d
Apaga ficheiros untracked da working directory. Operação destrutiva.
git clean -nfd
Submódulos
Adiciona um repositório como submódulo dentro do actual.
git submodule add -b main https://github.com/user/lib.git vendor/lib
Inicializa e descarrega submódulos definidos em .gitmodules.
git submodule update --init --recursive
Vê estado, corre comando em cada submódulo, ou desactiva-o.
git submodule foreach 'git pull origin main'
Hooks
Cria um ficheiro executável em .git/hooks/ com o nome do evento (pre-commit, pre-push, commit-msg, post-merge, etc).
printf '#!/bin/sh\nnpm run lint\n' > .git/hooks/pre-commit chmod +x .git/hooks/pre-commit
Define um directório de hooks partilhado (versionável, fora de .git).
git config core.hooksPath .githooks
Ferramenta JS para versionar hooks no package.json e instalá-los automaticamente.
npx husky init echo "npm test" > .husky/pre-commit
Salta os hooks pre-commit e commit-msg (usar com moderação).
git commit --no-verify -m "hotfix"
Avançado
Busca binária no histórico para encontrar o commit que introduziu um bug.
git bisect start git bisect bad HEAD git bisect good v1.0 git bisect reset
Cria múltiplas working directories ligadas ao mesmo .git, permitindo trabalhar em várias branches em paralelo.
git worktree add ../proj-hotfix hotfix/urgente
Reescreve histórico: combina, reordena, edita ou apaga commits.
git rebase -i HEAD~5 # pick a1b2 feat: x # squash c3d4 fix typo # reword e5f6 chore: y # drop g7h8 wip
Reescreve a história em massa, substituto moderno do git filter-branch. Útil para remover ficheiros sensíveis.
git filter-repo --path secrets.env --invert-paths
Cria um tarball ou zip do conteúdo de uma ref, sem .git.
git archive --format=zip --prefix=app/ -o release.zip v1.0
Empacota commits num ficheiro único, transferível offline.
git bundle create repo.bundle --all git clone repo.bundle nova-pasta
Resolve uma referência num SHA completo, curto ou nome.
git rev-parse HEAD git rev-parse --abbrev-ref HEAD git rev-parse --short HEAD
Inspecciona objectos do Git (blobs, trees, commits, tags).
git cat-file -p HEAD git cat-file -t a1b2c3d
Lista ficheiros tracked (ls-files) ou conteúdo de uma tree (ls-tree).
git ls-files git ls-tree -r HEAD --name-only
Manutenção: garbage collection, integridade, remoção de objectos soltos.
git gc --aggressive --prune=now git fsck --full
Permite ter só um subconjunto da árvore localmente, útil para monorepos grandes.
git sparse-checkout init --cone git sparse-checkout set apps/web libs/ui
Adiciona notas a commits sem alterar o seu SHA.
git notes add -m "reviewed by QA" HEAD
Referência
┌──────────────┐ git add ┌────────────┐ git commit ┌─────────────┐ git push ┌──────────┐
│ Working Dir │ ───────────▶ │ Staging │ ───────────▶ │ Local Repo │ ──────────▶ │ Remote │
│ (files) │ ◀─────────── │ (index) │ ◀─────────── │ (.git) │ ◀────────── │ (origin) │
└──────────────┘ git restore └────────────┘ git reset └─────────────┘ git fetch └──────────┘
git pull = git fetch + git merge- untrackedficheiro novo, ainda não conhecido pelo Git
- modifiedficheiro conhecido foi alterado
- stagedmarcado para o próximo commit
- committedguardado em .git, parte da história
- ignoredlistado em .gitignore
Branches partilhadas, integrar features grandes preservando contexto, branches de release.
- Não reescreve história
- Seguro em qualquer cenário
- Preserva timeline real
- História com diamantes e ruído
- git log mais difícil de ler
Actualizar feature branch local com a main antes do PR. Manter história linear.
- História linear e limpa
- git log legível
- git bisect mais eficaz
- Reescreve SHAs (NUNCA em branches públicas)
- Conflitos podem ser repetitivos
- Perde contexto temporal
Antes de mergear feature com vários commits 'wip' ou 'fix typo' na main.
- 1 commit limpo por feature
- main com história ultra-legível
- Perde granularidade do desenvolvimento
- git bisect só localiza a feature inteira
Regra de ouro: rebase localmente, merge publicamente. Nunca rebase em branches que outros usam.
--softMantém staging e working dirMove HEAD. Mantém staging e working dir intactos. Os ficheiros ficam staged.
Reagrupar commits sem perder alterações.
--mixedLimpa staging, mantém working dir(default) Move HEAD. Limpa staging mas mantém working dir. Os ficheiros ficam unstaged.
Refazer o que ia ao próximo commit.
--hardApaga tudo (destrutivo)Move HEAD. Limpa staging E working dir. Apaga alterações não commitadas. Destrutivo.
Voltar ao estado de outro commit, abandonando tudo.
fatal: refusing to merge unrelated historiesOs dois repositórios não têm um commit ancestral comum.
git pull origin main --allow-unrelated-histories
Updates were rejected because the remote contains work that you do not haveO remoto tem commits que o local desconhece.
git pull --rebase origin main e depois git push. Nunca push --force sem --force-with-lease.
Please commit your changes or stash them before you switch branchesHá alterações locais que entrariam em conflito ao mudar de branch.
git stash, git switch outra-branch e depois git stash pop.
CONFLICT (content): Merge conflict in <file>O merge ou rebase tocou nas mesmas linhas que outra branch.
Editar entre <<<<<<< ======= >>>>>>> e depois git add ficheiro seguido de git merge --continue. Para abortar: git merge --abort.
detached HEADFoi feito checkout de um SHA ou tag em vez de branch.
Para guardar o trabalho usa git switch -c nova-branch. Para descartar usa git switch main.
Permission denied (publickey)Chave SSH não configurada no GitHub ou GitLab.
Correr ssh-keygen -t ed25519 -C "email" e adicionar ~/.ssh/id_ed25519.pub às chaves SSH do serviço.
fatal: Authentication failed (HTTPS)O GitHub deixou de aceitar password, é preciso um Personal Access Token.
Gerar um PAT no GitHub e usá-lo como password, ou trocar o remote para SSH.
Your branch and 'origin/main' have divergedAmbos os lados têm commits diferentes.
git pull --rebase em feature local, ou git pull simples em main partilhada.
error: failed to push some refs (non-fast-forward)O remoto evoluiu, não é possível empurrar sem integrar primeiro.
git pull --rebase seguido de git push.
Apaguei a branch errada ou fiz reset --hard e perdi trabalhoOperação destrutiva sem backup.
git reflog para encontrar o SHA e depois git checkout -b recuperada <sha>. Os commits ficam ~30 dias antes do gc.
.gitignore não está a funcionarO ficheiro já estava tracked antes de ser ignorado.
git rm --cached <ficheiro> seguido de git commit -m "untrack". Para directórios usa git rm -r --cached <pasta>.
Commitei um segredo, password ou ficheiro .envgit add . sem cuidado.
Rodar o segredo, correr git filter-repo --path .env --invert-paths, git push --force-with-lease e avisar a equipa para reclonar.
LF will be replaced by CRLFDiferenças de fim de linha entre Windows e Unix.
git config --global core.autocrlf true no Windows ou input em Mac e Linux.
Filename too long (Windows)Limite de 260 caracteres do Windows.
git config --system core.longpaths true