Dicas e truques do git (ou "o que você tem no seu ~/.gitconfig?")

Olá,

Essa é uma espécie de enquete: quais seus truques e dicas preferidos do git?

Eu tenho uma apresentação de alguns meses atrás com algumas dicas que aprendi, mas a cada dia que passa aprendo outros truques interessantes, mas a cada dia aprendo algo novo.

Contribua com suas dicas, truques, ou compartilhando alguma experiência com git, na seção de comentários abaixo. :)

Algumas das dicas e truques que aprendi estão abaixo:

  • git rebase (e a opção --interactive) - essencial pra mim, mas uma das features mais incompreendidas do git
  • git pull --rebase - útil para o caso comum de "faça rebase dos meus commits locais sobre a versão mais recente upstream"
  • git add -p - útil quando você fez várias modificações nos seus arquivos, mas quer separar cada uma em commits diferentes
  • Outros comandos que recomendo conhecer e aprender a usar: git format-patch, git send-email, git am, git annotate (blame), git cherry-pick, git bisect, gitk
  • Comandos um pouco mais avançados mas interessantes: git reflog, git filter-branch
  • Aprenda a enxergar o "grafo" dos commits na cabeça (a ferramenta gitk é extremamente útil para isso). Saiba a diferença entre um "merge" e um "rebase".
  • Aprenda o que é o "index". Geralmente eu esqueço que ele existe no dia-a-dia, e só uso "git commit -a". Mas é importante saber que ele existe para entender determinadas operações mais avançadas. Aprenda a diferença entre "git commit ", "git commit" (sem lista de arquivos) e "git commit -a".

Opções que carrego no meu .gitconfig:

  1. [color]
  2. ui=1

A opção acima faz muitos comandos (ex.: diff, log) mostrar saída colorida, para facilitar visualização.

Algumas opções úteis eu carrego na seção "alias" para ter abreviações curtas para comandos e opções que eu uso mais frequentemente:

  1. [alias]
  2. ld=log --decorate --graph
  3. l1=log --pretty=oneline

As opções --decorate e --graph são extremamente úteis para enxergar o grafo de commits, e ver os branches e tags que apontam apra cada commit. A opção --pretty=oneline é útil para ver apenas um commit por linha, sem descrições longas. As três opções podem ser combinadas.

  1. [alias]
  2. a3=am -3

A opção "-3" do "git am" é útil para facilitar resolução de conflitos.

usando branches

Outra dica que está mais para "recomendação" que "truque" é criar branches para tudo que for fazer localmente. Para isso dominar o "git rebase" e "git pull --rebase" é extremamente útil.

Com vários branches, você consegue separar facilmente trabalho em áreas diferentes que pode ser testados/terminados/enviados em momentos diferentes. Mas seja disciplinado ao dar nome aos branches, porque é fácil se perder quando se tem muitos branches antigos perdidos no repositório.

--
Eduardo

git stash, git commit --amend

Depois de fazer esse post, o Tiago Galesi me lembrou de outro comando: git stash.

É útil para guardar modificações antes de fazer commit.

Porém, eu uso pouco o git stash, porque depois de aprender a usar 'git-rebase --interactive', o que faço quando tenho trabalho ainda em andamento é simplesmente fazer um commit. Depois posso usar 'git rebase --interactive' ou 'git commit --amend' para consertar o commit incompleto.

Porém ainda assim há um caso onde o git stash é útil para mim, que é quando tenho trabalho ainda não commitado e gostaria de trocar de branch antes de fazer commit. Muitas vezes o "git checkout" não deixa o usuário trocar de branch quando há modificações não commitadas. Então faço a sequência:

  1. git stash
  2. git checkout <meu-branch>
  3. git stash apply

--
Eduardo

corrigindo bug

Uma coisa que tenho usado com frequência no git rebase é o seguinte:

git tag bug
git checkout bug
... faço as modificações
git commit -a --amend
git tag fix
git rebase --onto fix bug

Muito útil, mas vale a dica de não ficar usando isso em coisa já publicada (como qualquer comando que reescreva o histórico)