O motivo pelo qual você não deseja rebase de commits que você enviou para um repositório público é porque o comando git-rebase
altera o histórico.
Agora, o que isso significa e por que isso é ruim? Primeiramente, sugiro ler esta seção do livro do Git. A partir disso, você aprenderá que commits consistem em um ponteiro para um objeto de árvore (captura instantânea dos arquivos) e um ponteiro para a confirmação pai. Agora, quando você "muda o histórico" ao rebasing commits em cima de novos commits, você está mudando o ponteiro pai dos commits que você já fez, o que muda o id dos seus commits.
A razão pela qual isso é ruim é que, se você compartilha seus commits publicamente, e outros iniciam um trabalho adicional baseado nesses commits, então você muda esses commits, suas árvores não estão mais sincronizadas.
Você pode ver tudo isso emitindo alguns comandos git-log
ao executar seu exemplo. Eu corri isso antes de executar o comando rebase:
$ git log --pretty=oneline origin/master
9b077261d1619803213201d5c7cefb757eb66b67 Changed foo in master
911ce5b247e79682ec9f73ad9a15fd3167b7e76d Added foo
$ git log --pretty=oneline origin/b1
63a57ef54e301314a9dab38de0cd9d88c59a5fba added foo2 in b1
911ce5b247e79682ec9f73ad9a15fd3167b7e76d Added foo
$ git log --pretty=oneline b1
63a57ef54e301314a9dab38de0cd9d88c59a5fba added foo2 in b1
911ce5b247e79682ec9f73ad9a15fd3167b7e76d Added foo
E agora, depois de realizar o rebase, origin/master
e origin/b1
são iguais, mas b1
é agora:
$ git log --pretty=oneline b1
6687c64c37db0ee21a4d87e45d6ccb0913b8686d added foo2 in b1
9b077261d1619803213201d5c7cefb757eb66b67 Changed foo in master
911ce5b247e79682ec9f73ad9a15fd3167b7e76d Added foo
Você notará que a confirmação "added foo2 in b1" tem um id diferente do que nos comandos de log anteriores. Se você cometer esta alteração para o seu repositório público, agora você tem dois commits que têm o mesmo trabalho feito neles e causa problemas.
Agora, suponha que, em vez de rebasing b1 no topo do master, você apenas mesclou o master em b1, seu log seria assim:
$ git checkout b1
$ git merge origin/master
$ git log --pretty=oneline b1
518eb2dc6b2da0ff43ddd6837332031cc00eaad1 Merge remote-tracking branch 'origin/master' into b1
9b077261d1619803213201d5c7cefb757eb66b67 Changed foo in master
63a57ef54e301314a9dab38de0cd9d88c59a5fba added foo2 in b1
911ce5b247e79682ec9f73ad9a15fd3167b7e76d Added foo
Você notará a confirmação extra que representa a mesclagem dos dois commits anteriores. Esta história pode agora ser compartilhada e todos serão felizes.
git-log --graph
também pode ajudar a esclarecer o que está acontecendo.