Desde o tempo git cherry-pickaprendeu a ser capaz de aplicar vários commits, a distinção de fato se tornou um tanto discutível, mas isso é algo a ser chamado de evolução convergente ;-)
A verdadeira distinção reside na intenção original de criar as duas ferramentas:
git rebaseA tarefa de é encaminhar uma série de mudanças que um desenvolvedor possui em seu repositório privado, criado contra a versão X de algum branch upstream, para a versão Y desse mesmo branch (Y> X). Isso efetivamente muda a base daquela série de commits, daí o "rebasing".
(Também permite que o desenvolvedor transplante uma série de commits para qualquer commit arbitrário, mas isso é de uso menos óbvio.)
git cherry-pické para trazer um commit interessante de uma linha de desenvolvimento para outra. Um exemplo clássico é o backport de uma correção de segurança feita em um branch de desenvolvimento instável para um branch estável (manutenção), onde um mergenão faz sentido, pois traria uma série de alterações indesejadas.
Desde sua primeira aparição, git cherry-picktem sido capaz de escolher vários commits de uma vez, um por um.
Portanto, possivelmente a diferença mais marcante entre esses dois comandos é como eles tratam o branch em que trabalham: git cherry-picknormalmente traz um commit de algum outro lugar e o aplica no topo do seu branch atual, gravando um novo commit, enquanto git rebasepega seu branch atual e reescreve uma série de sua própria dica compromete de uma forma ou de outra. Sim, esta é uma descrição bastante simplificada do que git rebasepodemos fazer, mas é intencional, para tentar fazer com que a ideia geral seja absorvida.
Atualize para explicar melhor um exemplo de uso que git rebaseestá sendo discutido.
Dada esta situação,

o livro afirma:
No entanto, há outra maneira: você pode pegar o patch da mudança que foi introduzida em C3 e reaplicá-lo em cima de C4. No Git, isso é chamado de rebase. Com o comando rebase, você pode pegar todas as alterações que foram confirmadas em um branch e aplicá-las em outro.
Neste exemplo, você executaria o seguinte:
$ git checkout experiment
$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: added staged command
"O problema" aqui é que, neste exemplo, o branch "experimento" (o assunto para rebase) foi originalmente bifurcado do branch "mestre" e, portanto, compartilha commits de C0 a C2 com ele - efetivamente, "experimento" é " master "até, e incluindo, C2 mais commit C3 em cima dele. (Este é o caso mais simples possível; claro, "experimento" pode conter várias dezenas de commits em cima de sua base original.)
Agora git rebaseé instruído a realocar "experimento" na ponta atual do "mestre" e funciona git rebaseassim:
- Executa
git merge-basepara ver qual é o último commit compartilhado por "experimento" e "mestre" (qual é o ponto de desvio, em outras palavras). Este é C2.
- Salva todos os commits feitos desde o ponto de desvio; em nosso exemplo de brinquedo, é apenas C3.
- Rebobina o HEAD (que aponta para a confirmação da ponta do "experimento" antes que a operação comece a ser executada) para apontar para a ponta do "mestre" - estamos fazendo o rebaseamento nele.
- Tenta aplicar cada um dos commits salvos (como se com
git apply) em ordem. Em nosso exemplo de brinquedo, é apenas um commit, C3. Digamos que seu aplicativo produza um commit C3 '.
- Se tudo correr bem, a referência "experimento" é atualizada para apontar para o commit resultante da aplicação do último commit salvo (C3 'em nosso caso).
Agora, de volta à sua pergunta. Como você pode ver, aqui, tecnicamente, de git rebase fato, transplanta uma série de commits de "experimento" para a ponta de "mestre", então você pode dizer com razão que de fato há "outro ramo" no processo. Mas a essência é que o commit de ponta de "experimento" acabou sendo o novo commit de ponta em "experimento", apenas mudou sua base:

Novamente, tecnicamente você pode dizer que git rebaseaqui estão incorporados certos commits do "master", e isso é absolutamente correto.