Git puzzler - Работа над "отказом от быстрой перемотки вперед"

В моем локальном репозитории git у меня было по существу:

* commit A
|
* commit B (master) (origin/master)

Я сделал некоторые изменения, так что теперь:

* commit A
|\
| * commit B (develop) (origin/master)
|
* commit C (master)

Я бы хотел, чтобы репозиторий git (размещенный на beanstalkapp.com) обновлялся, чтобы отразить это, и выглядите так:

* commit A
|\
| * commit B (develop) (origin/develop)
|
* commit C (master) (origin/master)

Как я могу это сделать? git push не работает с denying non-fast-forward refs/head/master. Каковы мои варианты, чтобы обойти это?

Мой репо не был организован, и я хотел бы его реорганизовать раз и навсегда.

Ответы

Ответ 1

git checkout master
git merge origin/master strategy=ours
git push origin master

В стратегии 'ours' игнорируются все изменения, сделанные между commit A и B, и производится "поддельное" слияние (объединение только в имени). git push, то счастливо выполняет быстрое переключение между старым origin/master и новым master.

Результат:

* commit A
|\
| * commit B (develop)
| |
* | commit C
| /
* commit D, but identical to C (master) (origin/master)

Ответ 2

Вам разрешено принудительное нажатие?

В противном случае вы можете удалить ветку? В этом случае вы можете просто удалить старую ветку и нажать новую, что по сути является тем же, что и принудительное нажатие.