Короче говоря, потому что rebase изменяет идентификаторы коммитов, это все равно что переписывать историю. Вот пример:
Скажем, у вас есть мастер, у которого есть коммиты А1 и А2.
>> git log master
=> A1, A2
>> git checkout -b mybranch
>>> work..work..work
>> git commit mybranch
>>> work..work..work
>> git commit mybranch
// at this point mybranch contains A1, A2, A3, A4
>> git log mybranch
=> A1, A2, A3,A4
>> git push mybranch origin/mybranch
// now (its critical ! ) other users __checkout__ mybranch on their machines (and get commits A1, A2, A3, A4) of course
////////
// a couple of hours/days later ...
// ...meanwhile other people worked on master so now it looks like this:
>> git checkout master
>> git log
=> A1, A2, B1,B2 // commits B1 and B2 are new!!!
// and now let rebase:
>> git checkout mybranch
>> git rebase master
>> git log mybranch
=> A1, A2, B1, B2, A3', A4'
Обратите внимание, что в этот момент A3 стал A3 '(его sha1 изменился), и A4 перешло в A4 'Теперь вы можете принудительно создать эту историю sh (новая история, которая переписала историю с оригинальными коммитами A3 и A4). git push -- force mybranch
Однако, что будут делать ваши коллеги на этом этапе? Если они извлекают mybranch
по git pull mybranch
, должны ли они получить A3 и A3 '(то же самое относится и к A4 и A4')?
Это очень проблематично c, если только они не удаляют свою локальную копию из mybranch
и вытащить, как будто никогда не существовало на своих локальных машинах.