Comandos Git
Os comandos do dia a dia, e principalmente os de emergência — desfazer, recuperar e reescrever — que são justamente os que ninguém decora.
36 itens em 6 seções
Dia a dia
git status -sb- Estado do repositório em formato curto, com a branch e o rastreamento
git add -p- Escolhe trecho por trecho o que entra no commit
git commit -m "mensagem"- Cria o commit com o que está no stage
git commit --amend --no-edit- Acrescenta o stage ao último commit sem mudar a mensagem
git log --oneline --graph --all- Histórico compacto com o desenho das ramificações
git diff --staged- Mostra o que já está no stage, e não o que falta adicionar
Branches
git switch -c nova-branch- Cria e entra numa branch nova (substitui o antigo checkout -b)
git switch -- Volta para a branch anterior
git branch -vv- Lista as branches com o último commit e o remoto rastreado
git branch -d antiga- Apaga a branch já mesclada; -D força mesmo sem merge
git push -u origin minha-branch- Publica a branch e passa a rastreá-la
git fetch --prune- Atualiza as referências e remove as branches remotas que já não existem
Desfazer
git restore arquivo.txt- Descarta as alterações não commitadas do arquivo
git restore --staged arquivo.txt- Tira o arquivo do stage sem perder a alteração
git reset --soft HEAD~1- Desfaz o último commit e mantém tudo no stage
git reset --mixed HEAD~1- Desfaz o último commit e mantém as alterações fora do stage
git reset --hard HEAD~1- Desfaz o último commit e apaga as alterações — não tem volta pelo reset
git revert abc1234- Cria um commit que desfaz outro; é o certo em branch compartilhada
Recuperar o que sumiu
git reflog- Histórico de tudo que HEAD apontou; é aqui que mora o commit que você acha que perdeu
git reset --hard abc1234- Volta para um commit encontrado no reflog
git stash- Guarda as alterações e limpa a árvore de trabalho
git stash pop- Traz de volta o último stash e o remove da pilha
git stash list- Lista o que está guardado
git fsck --lost-found- Procura objetos órfãos quando nem o reflog ajuda
Conflitos e integração
git merge --no-ff outra-branch- Mescla criando um commit de merge, preservando o histórico da branch
git rebase main- Reaplica seus commits em cima da main; nunca faça isso em branch já publicada
git rebase --continue- Segue o rebase depois de resolver um conflito
git rebase --abort- Cancela o rebase e volta ao estado anterior
git checkout --ours arquivo- Em conflito, fica com a versão da branch atual
git checkout --theirs arquivo- Em conflito, fica com a versão que está chegando
Investigar
git blame -L 10,20 arquivo- Quem alterou por último cada linha do intervalo
git log -S "texto"- Encontra os commits que adicionaram ou removeram aquele texto
git log --follow arquivo- Histórico do arquivo mesmo depois de renomeações
git bisect start- Inicia a busca binária pelo commit que introduziu um bug
git show abc1234- Mostra o conteúdo completo de um commit
git diff main...minha-branch- Diferença desde o ponto em que as duas divergiram
Perguntas frequentes
- Qual a diferença entre reset e revert?
- O reset move o ponteiro da branch e reescreve o histórico; o revert cria um commit novo que desfaz o anterior. Em branch compartilhada, use revert — o reset obriga todo mundo a corrigir o histórico local.
- Apaguei um commit com reset --hard. Perdi mesmo?
- Quase certamente não. Rode git reflog: ele lista tudo que HEAD apontou nos últimos dias, inclusive o commit descartado. Basta um git reset --hard para o identificador que aparecer ali.
- Quando usar rebase em vez de merge?
- Rebase para manter linear o histórico da sua branch local antes de abrir o pull request. Merge quando a branch já foi publicada — reescrever commits que outras pessoas já baixaram cria divergência para todo o time.