Rebase работает путем копирования коммитов. Вы начинаете с, например ::
...--o--o--o <-- master
\
A--B--C <-- feature/fix-input-height (HEAD)
и в итоге:
A'-B'-C' <-- feature/fix-input-height
/
...--o--o--o <-- master
\
A--B--C [previous feature/fix-input-height, now abandoned]
Но у другого хранилища - того, которое не принадлежит вам, к которому вы обращаетесь к своему Git git push
, - все еще есть исходные коммиты. У вас больше нет этих коммитов. Вместо этого у вас есть новые и улучшенные, но они этого не знают. Все, что они знают, это то, что вы просите их выбросить три совершенно хороших коммита.
Так они говорят Нет, я не буду их выбрасывать. По крайней мере, если вы используете принудительную команду, а не вежливый запрос.
Вот почему вам нужно --force
, или, что лучше, хотя люди не часто его используют - --force-with-lease
. В любом случае вы говорите им: Да, я имею в виду, что вы должны выбросить свои коммиты. Разница между этими двумя заключается в том, что --force
просто говорит: Бросьте ваши коммиты! Используйте это вместо этого! Использование --force-with-lease
говорит: Я думаю, что ваши feature/fix-input-height
имена фиксируют C
. Если так: выбросить эти коммиты! Используйте это вместо этого! Он потерпит неудачу, если кто-то добавил коммит D
, которого у вас нет и, следовательно, не включили в ваш ребаз.