Jhonatan Pinheiro
Loading page...
Jhonatan Pinheiro
Loading page...
Jhonatan Pinheiro
Loading page...
Setup, commits, branches, merge and rebase, remotes, the undo chapter (reset, revert, reflog), bisect and blame: 100 commands with examples.
Git é a ferramenta que todo desenvolvedor usa e quase ninguém domina por inteiro. A boa notícia: uns 20 comandos cobrem 95% do trabalho — os outros 80 são o que salva você no dia em que algo dá errado.
Estes 100 comandos estão na ordem em que aparecem na vida real: configurar, criar, commitar, ramificar, integrar, publicar, desfazer e investigar.
Regra de ouro: enquanto você não deu
push, quase tudo é reversível. Depois do push, prefira comandos que adicionam história (comorevert) em vez dos que a reescrevem (comorebasee--force).
Feito uma vez por máquina — e o que evita commit com autor errado.
É o que aparece na autoria de cada commit. Sem isso, o Git reclama no primeiro commit.
git config --global user.name "Jhonatan Pinheiro"
git config --global user.email "voce@email.com"Lista tudo que está valendo e de onde cada valor veio.
git config --list --show-originSem --global, vale só no projeto atual. Útil para separar e-mail pessoal do corporativo.
git config user.email "voce@empresa.com"Define quem abre a mensagem de commit e o rebase interativo.
git config --global core.editor "code --wait"Faz todo repositório novo nascer com main em vez de master.
git config --global init.defaultBranch mainEvita o clássico diff gigante entre Windows e Linux.
git config --global core.autocrlf true # Windows
git config --global core.autocrlf input # Linux e macOSComandos longos que você repete todo dia merecem um apelido.
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.lg "log --oneline --graph --decorate --all"Evita digitar token a cada push.
git config --global credential.helper store # salva em disco
git config --global credential.helper manager # Windows (gerenciador do SO)Prova criptográfica de autoria — o selo Verified no GitHub.
git config --global user.signingkey SEU_ID_GPG
git config --global commit.gpgsign trueFaz o git pull reclamar em vez de criar merge sozinho. Evita história embolada.
git config --global pull.rebase false
git config --global pull.ff onlyO ponto de partida: transformar uma pasta em repositório ou trazer um existente.
Transforma a pasta atual em um repositório Git (cria o diretório .git).
git initBaixa o projeto com todo o histórico e já configura o remoto origin.
git clone https://github.com/usuario/projeto.gitDefine o nome do diretório de destino.
git clone https://github.com/usuario/projeto.git minha-pastaTraz só os commits mais recentes. Muito mais rápido em repositório grande — ideal em CI.
git clone --depth 1 https://github.com/usuario/projeto.gitBaixa apenas o ramo que interessa.
git clone --branch desenvolvimento --single-branch https://github.com/usuario/projeto.gitSem digitar senha/token, desde que sua chave esteja cadastrada.
git clone git@github.com:usuario/projeto.gitLista o que o Git deve ignorar. Coloque aqui dependências, build e segredos.
# .gitignore
node_modules/
.env
.env.local
dist/
*.logAdicionar ao .gitignore não remove o que já está versionado.
git rm --cached .env
git commit -m "chore: remove .env do versionamento"Ver o que mudou, escolher o que entra e registrar. Noventa por cento do uso do Git.
Mostra o que mudou, o que está preparado e em que branch você está. Rode sempre antes de commitar.
git status
git status -s # versão curtaMove a alteração para a staging area — a antessala do commit.
git add arquivo.ts
git add src/Adiciona tudo que mudou. Confira com status antes, para não levar arquivo indesejado.
git add .Escolhe pedaço por pedaço dentro do mesmo arquivo. O melhor amigo do commit pequeno.
git add -pDiferença entre o que está no disco e o último commit (sem contar o que já foi preparado).
git diffMostra exatamente o que vai entrar no próximo commit.
git diff --stagedCompara dois pontos quaisquer da história.
git diff main..minha-feature
git diff main..minha-feature -- src/appRegistra o que está preparado. A mensagem é documentação: escreva o porquê.
git commit -m "feat: adiciona filtro por assunto no blog"Título curto, linha em branco, e o contexto embaixo.
git commit -m "fix: corrige contraste do tema claro" -m "O primary ficava em 3,2:1 sobre o fundo, abaixo do minimo AA."Adiciona e commita arquivos já rastreados de uma vez. Não pega arquivo novo.
git commit -am "refactor: extrai helper de datas"Convenção que deixa o histórico legível e permite gerar changelog automático.
# feat, fix, docs, style, refactor, perf, test, chore
git commit -m "perf(db): indexa pedidos por cliente_id"Corrige o último commit (mensagem ou conteúdo). Só antes do push.
git commit --amend -m "mensagem corrigida"
git commit --amend --no-edit # só adiciona o que está preparadoSem alteração nenhuma — útil para disparar um pipeline de CI.
git commit --allow-empty -m "chore: dispara build"Renomear e remover mantendo o rastro no histórico.
git mv antigo.ts novo.ts
git rm obsoleto.tsRamificar é barato no Git. Uma branch por tarefa é o padrão que evita dor de cabeça.
Mostra as locais; com -a, também as remotas.
git branch
git branch -a
git branch -vv # com o último commit e o remoto de cada umaCria a partir do commit atual, sem mudar para ela.
git branch minha-featureswitch é o comando moderno; checkout continua funcionando.
git switch minha-feature
git checkout minha-featureO atalho mais usado do dia a dia.
git switch -c minha-feature
git checkout -b minha-featureSai de um ponto específico em vez do commit atual.
git switch -c hotfix mainRenomeia a atual (-m) ou uma específica.
git branch -m novo-nome
git branch -m nome-antigo novo-nome-d recusa se houver commit não integrado; -D força.
git branch -d minha-feature
git branch -D minha-featureRemove o ramo do servidor depois do merge.
git push origin --delete minha-featureO - funciona como no cd.
git switch -Lista o que já foi mesclado — candidatas seguras a apagar.
git branch --merged main
git branch --no-merged mainVincula a branch local à do servidor, para push/pull sem argumentos.
git branch --set-upstream-to=origin/minha-featureRemove do seu clone as branches que já não existem no servidor.
git fetch --pruneDuas branches abertas em pastas diferentes ao mesmo tempo, sem clonar de novo.
git worktree add ../projeto-hotfix hotfix
git worktree list
git worktree remove ../projeto-hotfixÚtil dentro de script e prompt de terminal.
git branch --show-currentDuas formas de integrar trabalho — e como sair do conflito sem perder nada.
Traz a branch informada para a atual, criando um commit de merge quando necessário.
git switch main
git merge minha-featureSem divergência, o Git só avança o ponteiro — história linear, sem commit extra.
git merge --ff-only minha-featureForça o commit de merge, preservando a existência da branch na história.
git merge --no-ff minha-featureVolta tudo ao estado anterior ao merge.
git merge --abortEdite os arquivos marcados, remova os marcadores, adicione e conclua.
git status # lista os conflitos
# edite os arquivos e remova <<<<<<< ======= >>>>>>>
git add arquivo-resolvido.ts
git commitAceita a versão sua ou a que veio, sem edição manual.
git checkout --ours arquivo.ts # a versão da branch atual
git checkout --theirs arquivo.ts # a versão que está entrandoAbre o conflito em uma ferramenta gráfica configurada.
git mergetoolReaplica seus commits em cima de outra branch. Deixa a história linear.
git switch minha-feature
git rebase mainReordena, junta (squash), edita e remove commits antes de abrir o PR.
git rebase -i HEAD~5Resolveu o conflito? Continue. Complicou? Aborte.
git rebase --continue
git rebase --skip
git rebase --abortLeva um commit específico para a branch atual — clássico do hotfix.
git cherry-pick a1b2c3d
git cherry-pick a1b2c3d..e4f5g6hRebase na sua branch antes do PR; merge para integrar na main. Nunca faça rebase de branch compartilhada.
# Bom: atualizar sua feature
git switch minha-feature && git rebase main
# Bom: integrar na principal
git switch main && git merge --no-ff minha-featureSincronizar seu clone com o servidor — e entender a diferença entre fetch e pull.
Mostra os endereços configurados para buscar e enviar.
git remote -vConecta o repositório local a um servidor.
git remote add origin git@github.com:usuario/projeto.gitUsado ao migrar de HTTPS para SSH ou ao mudar de organização.
git remote set-url origin git@github.com:usuario/projeto.gitBaixa as novidades sem mexer no seu trabalho. O comando mais seguro do Git.
git fetch originÉ fetch + merge em um passo só. Traz e já integra na sua branch.
git pull origin mainIntegra reaplicando seus commits por cima — sem commit de merge no meio do caminho.
git pull --rebase origin mainEnvia seus commits para o servidor.
git push origin main-u vincula a branch local à remota; depois basta git push.
git push -u origin minha-feature--force-with-lease recusa se alguém publicou algo que você ainda não viu. Sempre prefira este ao --force.
git push --force-with-lease origin minha-featureTags não sobem no push comum.
git push origin v1.2.0
git push origin --tagsQuantos commits você está à frente ou atrás.
git fetch
git status -sb
git log --oneline origin/main..HEAD # o que você tem a maisMantém seu fork em dia com o projeto original.
git remote add upstream https://github.com/original/projeto.git
git fetch upstream
git merge upstream/mainQuase tudo no Git é reversível. A diferença está em o que já foi publicado.
Volta o arquivo ao último commit. Perde o que não foi salvo.
git restore arquivo.ts
git checkout -- arquivo.ts # forma antigaZera o diretório de trabalho. Use com consciência.
git restore .Remove do que está preparado, mas mantém a alteração no arquivo.
git restore --staged arquivo.ts
git reset arquivo.ts # forma antigaDesfaz o commit e mantém tudo preparado. Ideal para refazer a mensagem ou juntar commits.
git reset --soft HEAD~1Desfaz o commit e tira da staging, preservando os arquivos. É o padrão.
git reset HEAD~1Desfaz o commit e apaga as alterações. Não tem desfazer — a não ser pelo reflog.
git reset --hard HEAD~1Cria um commit novo que desfaz outro. É a forma correta de reverter algo já publicado.
git revert a1b2c3dPrecisa indicar qual lado é o principal (-m 1).
git revert -m 1 a1b2c3dRegistra tudo por onde o HEAD passou, inclusive commits perdidos por reset. Salva quase qualquer situação.
git reflog
git reset --hard HEAD@{2}Traz de volta a versão de um commit específico.
git restore --source=HEAD~3 arquivo.tsAche o commit no reflog e recrie a branch nele.
git reflog
git branch minha-feature-recuperada a1b2c3dApaga arquivos não rastreados. Rode com -n antes para ver o que sairia.
git clean -n # simula
git clean -fd # apaga arquivos e diretórios
git clean -fdx # inclui o que está no .gitignoreSó aquele arquivo volta no tempo; o resto fica como está.
git checkout a1b2c3d -- caminho/arquivo.tsUm .env commitado continua no histórico até ser reescrito — e o token precisa ser trocado de qualquer forma.
git filter-repo --path .env --invert-paths
# depois: git push --force-with-lease (combine com o time antes)Descobrir quando, por que e por culpa de qual commit aquilo quebrou.
O histórico. Sozinho é verboso demais — as variações abaixo valem mais.
git log
git log -5A visão mais útil: compacta, com ramificações desenhadas.
git log --oneline --graph --decorate --allRecorta o histórico por quem e quando.
git log --author="Jhonatan" --since="2 weeks ago"Acha o commit que introduziu (ou removeu) determinado trecho.
git log -S "getThemeSelection" --onelineSó os commits que tocaram naquele caminho; --follow acompanha renomeações.
git log --follow -p -- src/lib/theme/presets.tsMostra um commit inteiro: mensagem, autor e diff.
git show a1b2c3dDiz quem escreveu cada linha e em qual commit. Use para entender, não para culpar.
git blame src/app/page.tsx
git blame -L 40,60 src/app/page.tsxBusca binária no histórico: acha em poucos passos o commit que quebrou.
git bisect start
git bisect bad # o atual está quebrado
git bisect good v1.0.0 # aqui funcionava
# teste, marque good/bad, repita
git bisect resetResumo por autor.
git shortlog -sn --allSem trocar de branch nem mexer no diretório.
git show a1b2c3d:src/app/page.tsxGuardar trabalho pela metade, marcar versões e reunir repositórios.
Guarda as alterações e limpa o diretório — para trocar de contexto às pressas.
git stash
git stash push -m "meio da refatoração"pop aplica e remove da pilha; apply mantém guardado.
git stash list
git stash pop
git stash apply stash@{1}Por padrão o stash ignora o que não está rastreado.
git stash -uMarca uma versão com autor, data e mensagem. Prefira à tag simples.
git tag -a v1.2.0 -m "Release 1.2.0"
git push origin v1.2.0Apagar exige remover local e remotamente.
git tag -l "v1.*"
git tag -d v1.2.0
git push origin --delete v1.2.0Um repositório dentro do outro, preso a um commit específico.
git submodule add https://github.com/usuario/lib.git libs/lib
git submodule update --init --recursive
git clone --recurse-submodules https://github.com/usuario/projeto.git