Using 'git cherry-pick' to Simulate 'git rebase'

Depois que você entende o git cherry-pick, você pode começar a pensar no git rebase como uma maneira mais rápida de fazer cherry-pick de todos os commits de um branch de uma vez, em vez de ter que digitar os seus IDs separadamente.

(Isso é apenas o início do que o rebase pode fazer, mas eu vou escrever o resto desta seção outra hora.)

Vamos voltar ao nosso exemplo, mas desta vez adicionar alguns branches...

Agora, eu poderia digitar esta sequência de comandos:

git checkout foo
git checkout -b newbar
git cherry-pick C D E

Nessa ordem, esses comandos:

  • garantem que estamos em H (porque 'foo' aponta para ele),
  • criam e fazem o checkout de um branch temporário chamado "newbar", também apontando para H,
  • aplicam as mudanças de C, D, e E, criando os novos commits C', D', e E', e atualizam o branch "newbar" para que ele aponte para E'.

O que me daria um repositório que pareceria com isso:

Então, eu poderia digitar isso:

git checkout bar
git reset --hard newbar
git branch -d newbar

O que:

  • Trocaria para o branch chamado "bar",
  • Forçaria o ponteiro do branch "bar" para que ele apontasse para o mesmo local que o branch "newbar" (e, graças ao flag --hard, atualizaria o meu diretório de trabalho para ficar igual ao novo local), e
  • Deletaria o branch temporário "newbar".

E deixaria o meu repositório parecido com isso (note que os vértices D e E originais não são mais alcançáveis, já que nenhum branch aponta para eles):

Ou, eu poderia fazer tudo isso digitando o seguinte:

git rebase foo bar

Em outras palavras, 'git rebase' (nesta forma) é um atalho que permite que você pegue seções inteiras de um repositório e as mova para algum outro lugar.