Meus comandos Git favoritos
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:
git log --oneline --graph --allEu 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
squashoufixup - 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:
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.
git reflogDepois 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.
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.