GilLabs notes, talks, and experiments

Meus comandos Git favoritos

30 May 2026

Depois de ver alguns posts sobre comandos git como esse e esse, decidi também fazer a minha versão. Então, esta é uma lista pequena das coisas de Git que eu acabo voltando a usar de novo e de novo:

git add -i

Permite adicionar arquivos de forma interativa para a staging area.

Eu gosto bastante desse comando quando faço alterações em várias arquivos ao mesmo tempo e quero separar em commits menores. Em vez de mandar tudo para o commit de uma vez, dá para revisar arquivo por arquivo e escolher o que entra.

git add -p

Esse é parecido com o git add -i, mas vai um nível mais fundo: ele permite adicionar partes específicas de um arquivo.

É muito útil quando o mesmo arquivo tem duas mudanças diferentes. Por exemplo, você corrigiu um bug e também fez uma pequena refatoração no mesmo arquivo. Com git add -p, dá para colocar só o bug fix no commit atual e deixar a refatoração para outro commit.

git log --oneline --graph --all

Esse é o comando clássico para visualizar o histórico como um grafo:

bash
git log --oneline --graph --all

Eu uso muito para entender rapidamente onde estou, quais branches existem, onde aconteceu um merge e se minha branch divergiu de outra.

git rebase -i

O git rebase -i é um dos comandos mais úteis para limpar uma sequência de commits antes de abrir um PR ou antes de compartilhar uma branch.

Com ele, dá para:

  • reorganizar commits
  • juntar commits pequenos com squash ou fixup
  • editar mensagens
  • remover commits que não fazem mais sentido

É claro que também é um comando para usar com cuidado, principalmente em branches já compartilhadas. Mas em branches locais, antes de publicar, ele é excelente para transformar uma sequência meio bagunçada de trabalho em uma história mais fácil de revisar.

git push origin HEAD:<branch>

Manda o commit atual do seu HEAD para uma branch específica no origin. Muito útil se você não estiver com a branch local usando o mesmo nome da branch remota, ou se quiser publicar exatamente o estado atual sem precisar trocar de branch.

git bisect

git bisect é um daqueles comandos que eu acho bonito conceitualmente: ele faz uma busca binária no histórico para descobrir em qual commit um bug foi introduzido.

A ideia básica é marcar um commit como bom e outro como ruim:

bash
git bisect startgit bisect badgit bisect good <commit-bom>

A partir daí, o Git vai pulando pelo histórico e você vai dizendo se cada ponto testado está bom ou ruim. No fim, ele aponta o commit suspeito.

O comando fica ainda mais poderoso quando combinado com testes automatizados, porque dá para deixar o Git testar os commits por você.

git reflog

O reflog muitas vezes salva você depois de um "reset errado", um "rebase ruim" ou uma confusão com detached HEAD.

Enquanto o git log mostra o histórico dos commits alcançáveis pela branch atual, o git reflog mostra por onde o seu HEAD passou recentemente.

Isso significa que, quando um commit "sumiu", muitas vezes ele ainda aparece no reflog.

bash
git reflog

Depois de encontrar o hash perdido, você pode criar uma branch temporária ou voltar para aquele ponto com cuidado.

Aliases e funções bash

Criar atalhos e funções utilitárias é uma boa adição para o seu devX pessoal. Nessa linha, tenho um repo com comandos que venho colecionando nos últimos anos:

https://github.com/adrianogil/git-tools

Um exemplo é o gz, uma função para fazer git reset --hard para uma referência escolhida com fzf. Só cuidado, porque o hard reset pode apagar mudanças não commitadas.

bash
function ghard-reset-fz() {    if [ -n "$1" ]; then        echo "Git hard reset to ref $1"        git reset --hard "$1"        return $?    fi    # Build a nice list with:    # <ref> | <short-hash> | <author> | <date> | <subject>    local line ref    line=$(        git for-each-ref \            --sort=-committerdate \            --format='%(refname:short) | %(objectname:short) | %(authorname) | %(committerdate:short) | %(subject)' \            refs/heads refs/remotes \        | default-fuzzy-finder    ) || return 1  # user aborted    # Take only the first field (the ref name before the first '|')    ref=\((awk -F'|' '{gsub(/^ *| *\)/, "", \(1); print\)1}' <<< "$line")    if [ -z "$ref" ]; then        echo "No ref selected."        return 1    fi    echo "Git hard reset to ref $ref"    git reset --hard "$ref"}alias gz="ghard-reset-fz"

Você pode copiar aliases de outras pessoas, mas escrever os seus ensina muito mais. Comece com 3 comandos que você usa todos os dias. Dê bons nomes. Documente. Melhore com o tempo. Esse processo constrói tanto ferramentas melhores quanto uma intuição melhor de Git.