MaisTools
Desenvolvedor/

Git Cheat Sheet

Referência rápida de Git: comandos, flags, exemplos e variações organizados por secção, com pesquisa instantânea.

Git Cheat Sheet

Comandos, flags, exemplos e erros comuns

Configuração

git config

Lê ou define opções de configuração do Git em três níveis: sistema, utilizador (global) ou repositório (local).

Flags--global--local--system--list--unset--edit
Exemplo
git config --global user.name "John Doe"
git config --global user.email "john.doe@example.com"
git config credential.helper

Define como o Git memoriza credenciais HTTPS para não pedir password a cada push.

Exemplo
git config --global credential.helper manager
git config --global core.excludesfile

Define um .gitignore global aplicado a todos os repositórios.

Exemplo
git config --global core.excludesfile ~/.gitignore_global

Repositórios

git init

Cria um repositório Git novo no directório actual.

Flags--bare--initial-branch=--shared
Exemplo
git init
git init --initial-branch=main meu-projeto
git clone

Copia um repositório remoto para a máquina local com toda a história.

Flags--depth--branch--single-branch--recurse-submodules--mirror--bare
Exemplo
git clone https://github.com/user/repo.git

Stage e commit

git status

Mostra o estado da working directory e do staging: o que está modificado, staged ou untracked.

Flags-s-b--ignored-uno
Exemplo
git status
git add

Move alterações da working directory para o staging area, preparando-as para o próximo commit.

Flags-A-p-i-u-n-f
Exemplo
git add src/components/Button.tsx
git add .
git commit

Grava o conteúdo do staging num novo commit do repositório local com uma mensagem.

Flags-m-a--amend--no-edit-S--allow-empty--no-verify--fixup--squash
Exemplo
git commit -m "feat: adiciona git cheat sheet"
git restore

Restaura ficheiros: tira do staging ou desfaz alterações na working directory.

Flags--staged--source=--worktree
Exemplo
git restore --staged file.txt
git restore file.txt
git rm

Remove ficheiros do repositório (e opcionalmente do disco).

Flags--cached-r-f-n
Exemplo
git rm secret.env
git mv

Renomeia ou move um ficheiro tracked, equivalente a mv + git add + git rm.

Flags-f-n
Exemplo
git mv old.tsx new.tsx

Branches

git branch

Lista, cria, renomeia ou apaga branches.

Flags-a-r-vv-d-D-m-M--merged--no-merged--contains
Exemplo
git branch
git branch feature/login
git checkout

Comando antigo para mudar de branch ou repor ficheiros. Hoje recomenda-se git switch e git restore.

Flags-b-B--orphan--detach
Exemplo
git checkout main
git checkout -b feature/x
git switch

Versão moderna do checkout só para mudar de branch.

Flags-c-C--detach--discard-changes
Exemplo
git switch main
git switch -c feature/login

Merge e rebase

git merge

Junta as alterações de outra branch na actual, criando um commit de merge se necessário.

Flags--no-ff--ff-only--squash--abort--continue-X-s
Exemplo
git switch main
git merge feature/login
git rebase

Reaplica os commits da branch actual por cima de outra base, reescrevendo a história.

Flags-i--onto--continue--abort--skip--autosquash--autostash
Exemplo
git switch feature
git rebase main
git cherry-pick

Aplica um commit específico de outra branch na actual.

Flags-x-n--continue--abort
Exemplo
git cherry-pick a1b2c3d
git mergetool

Abre uma ferramenta gráfica para resolver conflitos de merge.

Flags--tool=-y
Exemplo
git mergetool --tool=meld

Remote

git remote

Gere os remotos do repositório (origin, upstream, etc).

Subcomandosaddremoverenameset-urlshowprune
Flags-v
Exemplo
git remote -v
git fetch

Descarrega commits e refs do remoto sem os integrar na branch local.

Flags--all--prune--tags--depth--unshallow
Exemplo
git fetch origin
git pull

Equivale a git fetch seguido de git merge (ou rebase) na branch actual.

Flags--rebase--ff-only--no-rebase--autostash
Exemplo
git pull origin main
git push

Envia commits locais para o remoto.

Flags-u--force--force-with-lease--tags--delete--dry-run--all
Exemplo
git push -u origin feature/login

Stash

git stash

Guarda alterações não commitadas numa pilha temporária para limpar a working directory.

Subcomandospush
Flags-u-a-m-k-p
Exemplo
git stash push -m "WIP login"
git stash list / show / pop / apply / drop / clear

Manipulação da pilha de stashes.

Exemplo
git stash list
git stash pop

Tags

git tag

Cria, lista, apaga ou verifica tags. As tags marcam pontos no histórico (releases).

Flags-a-m-s-d-l-f
Exemplo
git tag -a v1.2.0 -m "Release 1.2"
git describe

Devolve um nome legível baseado na tag mais próxima.

Flags--tags--always--dirty--abbrev
Exemplo
git describe --tags --always --dirty

Log

git log

Mostra o histórico de commits com filtros e formatação flexíveis.

Flags--oneline--graph--all--decorate-p--stat--since--author--grep-S
Exemplo
git log --oneline --graph --decorate --all
git show

Mostra o conteúdo de um commit, tag ou objecto.

Flags--stat--name-only--name-status
Exemplo
git show HEAD
git show a1b2c3d:src/file.tsx
git diff

Mostra diferenças entre working dir, staging, commits ou branches.

Flags--cached--staged--stat--name-only--word-diff
Exemplo
git diff
git diff --cached
git diff main feature
git blame

Mostra quem alterou cada linha de um ficheiro e em que commit.

Flags-L-w-C-M
Exemplo
git blame -L 10,30 file.tsx
git shortlog

Resumo agrupado por autor (útil para release notes).

Flags-s-n-e
Exemplo
git shortlog -sne
git reflog

Histórico local de tudo o que o HEAD tocou. Salva-vidas para recuperar commits perdidos.

Subcomandosshowexpiredelete
Exemplo
git reflog
git reset --hard HEAD@{2}

Desfazer

git reset

Move HEAD para outro commit, opcionalmente alterando staging e working dir.

Flags--soft--mixed--hard--keep--merge
Exemplo
git reset --soft HEAD~1
git reset --mixed HEAD~1
git reset --hard HEAD~1
git revert

Cria um novo commit que desfaz as alterações de outro. Seguro em branches partilhadas.

Flags--no-commit-m--continue--abort
Exemplo
git revert a1b2c3d
git clean

Apaga ficheiros untracked da working directory. Operação destrutiva.

Flags-n-f-d-x-X-i
Exemplo
git clean -nfd

Submódulos

git submodule add

Adiciona um repositório como submódulo dentro do actual.

Flags-b--name
Exemplo
git submodule add -b main https://github.com/user/lib.git vendor/lib
git submodule init / update

Inicializa e descarrega submódulos definidos em .gitmodules.

Flags--init--recursive--remote--merge--rebase
Exemplo
git submodule update --init --recursive
git submodule status / foreach / deinit

Vê estado, corre comando em cada submódulo, ou desactiva-o.

Flags--recursive
Exemplo
git submodule foreach 'git pull origin main'

Hooks

Activar um hook manual

Cria um ficheiro executável em .git/hooks/ com o nome do evento (pre-commit, pre-push, commit-msg, post-merge, etc).

Exemplo
printf '#!/bin/sh\nnpm run lint\n' > .git/hooks/pre-commit
chmod +x .git/hooks/pre-commit
git config core.hooksPath

Define um directório de hooks partilhado (versionável, fora de .git).

Exemplo
git config core.hooksPath .githooks
Husky

Ferramenta JS para versionar hooks no package.json e instalá-los automaticamente.

Exemplo
npx husky init
echo "npm test" > .husky/pre-commit
git commit --no-verify

Salta os hooks pre-commit e commit-msg (usar com moderação).

Exemplo
git commit --no-verify -m "hotfix"

Avançado

git bisect

Busca binária no histórico para encontrar o commit que introduziu um bug.

Subcomandosstartgoodbadskipresetrun
Exemplo
git bisect start
git bisect bad HEAD
git bisect good v1.0
git bisect reset
git worktree

Cria múltiplas working directories ligadas ao mesmo .git, permitindo trabalhar em várias branches em paralelo.

Subcomandosaddlistremoveprune
Exemplo
git worktree add ../proj-hotfix hotfix/urgente
git rebase -i

Reescreve histórico: combina, reordena, edita ou apaga commits.

Subcomandospickrewordeditsquashfixupdropexec
Exemplo
git rebase -i HEAD~5
# pick    a1b2 feat: x
# squash  c3d4 fix typo
# reword  e5f6 chore: y
# drop    g7h8 wip
git filter-repo

Reescreve a história em massa, substituto moderno do git filter-branch. Útil para remover ficheiros sensíveis.

Flags--path--invert-paths--replace-text
Exemplo
git filter-repo --path secrets.env --invert-paths
git archive

Cria um tarball ou zip do conteúdo de uma ref, sem .git.

Flags--format--prefix-o
Exemplo
git archive --format=zip --prefix=app/ -o release.zip v1.0
git bundle

Empacota commits num ficheiro único, transferível offline.

Subcomandoscreateverifyunbundle
Exemplo
git bundle create repo.bundle --all
git clone repo.bundle nova-pasta
git rev-parse

Resolve uma referência num SHA completo, curto ou nome.

Flags--short--abbrev-ref--verify
Exemplo
git rev-parse HEAD
git rev-parse --abbrev-ref HEAD
git rev-parse --short HEAD
git cat-file

Inspecciona objectos do Git (blobs, trees, commits, tags).

Flags-p-t-s
Exemplo
git cat-file -p HEAD
git cat-file -t a1b2c3d
git ls-files / ls-tree

Lista ficheiros tracked (ls-files) ou conteúdo de uma tree (ls-tree).

Flags--cached--others--ignored
Exemplo
git ls-files
git ls-tree -r HEAD --name-only
git gc / fsck

Manutenção: garbage collection, integridade, remoção de objectos soltos.

Flags--aggressive--prune=now
Exemplo
git gc --aggressive --prune=now
git fsck --full
git sparse-checkout

Permite ter só um subconjunto da árvore localmente, útil para monorepos grandes.

Subcomandosinitsetlistdisable
Exemplo
git sparse-checkout init --cone
git sparse-checkout set apps/web libs/ui
git notes

Adiciona notas a commits sem alterar o seu SHA.

Subcomandosaddshoweditremove
Exemplo
git notes add -m "reviewed by QA" HEAD

Referência

Fluxo do Git
┌──────────────┐  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
Merge vs Rebase vs Squash
Merge

Branches partilhadas, integrar features grandes preservando contexto, branches de release.

Vantagens
  • Não reescreve história
  • Seguro em qualquer cenário
  • Preserva timeline real
Desvantagens
  • História com diamantes e ruído
  • git log mais difícil de ler
Rebase

Actualizar feature branch local com a main antes do PR. Manter história linear.

Vantagens
  • História linear e limpa
  • git log legível
  • git bisect mais eficaz
Desvantagens
  • Reescreve SHAs (NUNCA em branches públicas)
  • Conflitos podem ser repetitivos
  • Perde contexto temporal
Squash

Antes de mergear feature com vários commits 'wip' ou 'fix typo' na main.

Vantagens
  • 1 commit limpo por feature
  • main com história ultra-legível
Desvantagens
  • 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.

Reset: soft, mixed, hard
--softMantém staging e working dir

Move 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.

Erros comuns e soluções
fatal: refusing to merge unrelated histories
Causa

Os dois repositórios não têm um commit ancestral comum.

Solução

git pull origin main --allow-unrelated-histories

Updates were rejected because the remote contains work that you do not have
Causa

O remoto tem commits que o local desconhece.

Solução

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 branches
Causa

Há alterações locais que entrariam em conflito ao mudar de branch.

Solução

git stash, git switch outra-branch e depois git stash pop.

CONFLICT (content): Merge conflict in <file>
Causa

O merge ou rebase tocou nas mesmas linhas que outra branch.

Solução

Editar entre <<<<<<< ======= >>>>>>> e depois git add ficheiro seguido de git merge --continue. Para abortar: git merge --abort.

detached HEAD
Causa

Foi feito checkout de um SHA ou tag em vez de branch.

Solução

Para guardar o trabalho usa git switch -c nova-branch. Para descartar usa git switch main.

Permission denied (publickey)
Causa

Chave SSH não configurada no GitHub ou GitLab.

Solução

Correr ssh-keygen -t ed25519 -C "email" e adicionar ~/.ssh/id_ed25519.pub às chaves SSH do serviço.

fatal: Authentication failed (HTTPS)
Causa

O GitHub deixou de aceitar password, é preciso um Personal Access Token.

Solução

Gerar um PAT no GitHub e usá-lo como password, ou trocar o remote para SSH.

Your branch and 'origin/main' have diverged
Causa

Ambos os lados têm commits diferentes.

Solução

git pull --rebase em feature local, ou git pull simples em main partilhada.

error: failed to push some refs (non-fast-forward)
Causa

O remoto evoluiu, não é possível empurrar sem integrar primeiro.

Solução

git pull --rebase seguido de git push.

Apaguei a branch errada ou fiz reset --hard e perdi trabalho
Causa

Operação destrutiva sem backup.

Solução

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 funcionar
Causa

O ficheiro já estava tracked antes de ser ignorado.

Solução

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 .env
Causa

git add . sem cuidado.

Solução

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 CRLF
Causa

Diferenças de fim de linha entre Windows e Unix.

Solução

git config --global core.autocrlf true no Windows ou input em Mac e Linux.

Filename too long (Windows)
Causa

Limite de 260 caracteres do Windows.

Solução

git config --system core.longpaths true