Git — Resumo e Comandos Essenciais¶
Como o Git funciona¶
O Git é um sistema de controle de versão distribuído. Isso significa que cada desenvolvedor tem uma cópia completa do repositório na própria máquina, incluindo todo o histórico.
Os três estados de um arquivo¶
- Working Directory: onde você edita os arquivos normalmente.
- Staging Area: área intermediária onde você prepara o que vai entrar no próximo commit.
- Repositório: banco de dados interno do Git com todos os commits e histórico.
O que é um commit¶
Um commit é um snapshot (fotografia) do projeto num determinado momento. Cada commit tem um hash SHA-1 único, uma mensagem, o autor, a data e um ponteiro para o commit anterior — formando uma cadeia (histórico).
Branches e HEAD¶
Uma branch é apenas um ponteiro móvel para um commit. O HEAD aponta para a branch atual (ou diretamente para um commit, no estado "detached HEAD").
Repositório remoto¶
Um remote (ex: GitHub) é outra cópia do repositório. O Git sincroniza com ele via push e pull. Por convenção, o remote principal se chama origin.
Configuração inicial¶
git config --global user.name "Seu Nome"
git config --global user.email "seu@email.com"
git config --global core.editor "code --wait" # define o editor (VS Code neste caso)
git config --list # lista todas as configurações
Criar e clonar repositórios¶
git init # inicia um repositório novo na pasta atual
git init nome-do-projeto # cria uma nova pasta e inicia o repositório nela
git clone <url> # clona um repositório remoto
git clone <url> nome-local # clona e renomeia a pasta local
Status e histórico¶
git status # mostra o estado dos arquivos (modificados, staged, untracked)
git status -s # versão compacta do status
git log # histórico de commits completo
git log --oneline # histórico resumido (uma linha por commit)
git log --oneline --graph # histórico com visualização de branches
git log --oneline -10 # últimos 10 commits
git diff # diferença entre working directory e staging area
git diff --staged # diferença entre staging area e último commit
git diff <branch1> <branch2> # diferença entre duas branches
git show <hash> # detalhes de um commit específico
Adicionar e commitar¶
git add <arquivo> # adiciona um arquivo à staging area
git add . # adiciona todos os arquivos modificados/novos
git add -p # adiciona interativamente (pedaço por pedaço)
git commit -m "mensagem" # cria um commit com a mensagem
git commit -am "mensagem" # add + commit de arquivos já rastreados (não pega novos)
git commit --amend # reescreve o último commit (mensagem ou conteúdo)
git commit --amend --no-edit # reescreve o último commit mantendo a mesma mensagem
Branches¶
git branch # lista branches locais
git branch -a # lista branches locais e remotas
git branch nome # cria uma nova branch
git branch -d nome # deleta branch (seguro: só deleta se já foi mergeada)
git branch -D nome # força a deleção da branch
git branch -m nome-novo # renomeia a branch atual
git switch nome # muda para uma branch existente (Git 2.23+)
git switch -c nome # cria e muda para nova branch (Git 2.23+)
# Equivalentes mais antigos (ainda muito usados):
git checkout nome # muda para uma branch existente
git checkout -b nome # cria e muda para nova branch
Merge e Rebase¶
# Merge: une o histórico das branches com um "merge commit"
git merge nome-da-branch # merge da branch indicada na branch atual
# Rebase: reaplica seus commits sobre outra base (histórico linear)
git rebase main # reaplica commits da branch atual sobre main
git rebase -i HEAD~3 # rebase interativo dos últimos 3 commits
# (útil para squash, reordenar, editar mensagens)
# Resolver conflitos (após merge ou rebase com conflito):
# 1. Edite os arquivos conflitantes
git add <arquivo-resolvido>
git merge --continue # ou: git rebase --continue
git merge --abort # cancela o merge
git rebase --abort # cancela o rebase
Repositório remoto¶
git remote -v # lista os remotes configurados
git remote add origin <url> # adiciona um remote chamado origin
git remote remove origin # remove o remote
git fetch # busca atualizações do remote SEM aplicar
git fetch origin # fetch de um remote específico
git pull # fetch + merge da branch atual
git pull --rebase # fetch + rebase (histórico mais limpo)
git push origin nome-da-branch # envia a branch para o remote
git push -u origin nome-da-branch # envia e configura o upstream (tracking)
git push # envia a branch atual (se upstream configurado)
git push --force-with-lease # force push seguro (verifica conflitos remotos)
git push origin --delete nome-da-branch # deleta branch no remote
Desfazer e corrigir erros¶
# Tirar arquivo da staging area (mantém as alterações no working directory)
git restore --staged <arquivo> # (Git 2.23+)
git reset HEAD <arquivo> # equivalente mais antigo
# Descartar alterações no working directory (IRREVERSÍVEL)
git restore <arquivo> # (Git 2.23+)
git checkout -- <arquivo> # equivalente mais antigo
# Desfazer commits (sem alterar o working directory)
git reset --soft HEAD~1 # desfaz 1 commit, mantém tudo staged
git reset --mixed HEAD~1 # desfaz 1 commit, mantém arquivos modificados (padrão)
git reset --hard HEAD~1 # desfaz 1 commit e DESCARTA todas as alterações
# Criar um commit que reverte outro commit (seguro para histórico público)
git revert <hash> # cria um commit que desfaz o commit indicado
git revert HEAD # reverte o último commit
Stash — guardar trabalho temporariamente¶
git stash # guarda as alterações atuais numa pilha
git stash push -m "descrição" # stash com mensagem descritiva
git stash list # lista todos os stashes
git stash pop # aplica o stash mais recente e remove da pilha
git stash apply stash@{2} # aplica um stash específico sem remover
git stash drop stash@{0} # remove um stash específico
git stash clear # remove todos os stashes
Tags¶
git tag # lista todas as tags
git tag v1.0.0 # cria uma tag leve no commit atual
git tag -a v1.0.0 -m "Release 1.0.0" # cria uma tag anotada (recomendado)
git tag -a v1.0.0 <hash> # cria tag em um commit específico
git push origin v1.0.0 # envia uma tag para o remote
git push origin --tags # envia todas as tags
git tag -d v1.0.0 # deleta tag localmente
git push origin --delete v1.0.0 # deleta tag no remote
Cherry-pick¶
git cherry-pick <hash> # aplica um commit específico na branch atual
git cherry-pick <hash1> <hash2> # aplica múltiplos commits
git cherry-pick A..B # aplica um intervalo de commits (A exclusivo, B inclusivo)
git cherry-pick --no-commit <hash> # aplica as alterações sem criar o commit
.gitignore¶
Arquivo que lista padrões de arquivos e pastas que o Git deve ignorar.
git rm --cached <arquivo> # para de rastrear um arquivo sem deletá-lo do disco
# (útil quando você esqueceu de colocar no .gitignore)
Comandos úteis extras¶
git shortlog -sn # conta commits por autor
git blame <arquivo> # mostra quem escreveu cada linha de um arquivo
git bisect start # inicia busca binária para encontrar commit que introduziu um bug
git reflog # histórico de todos os movimentos do HEAD (salva-vidas!)
git clean -fd # remove arquivos não rastreados e pastas (IRREVERSÍVEL)
git ls-files # lista todos os arquivos rastreados pelo Git
Fluxo típico de trabalho¶
# 1. Atualizar main
git switch main
git pull
# 2. Criar branch para a feature
git switch -c feature/minha-feature
# 3. Desenvolver e commitar
git add .
git commit -m "feat: adiciona nova funcionalidade"
# 4. Atualizar com main antes de abrir PR
git fetch origin
git rebase origin/main
# 5. Enviar para o remote
git push -u origin feature/minha-feature
# 6. Após merge do PR, limpar
git switch main
git pull
git branch -d feature/minha-feature