2009-04-30 2 views
5

У меня есть локальный репозиторий git, который я недавно совершил, а затем перешел на общий репо. Только после того, как я подтолкнул его к общему репо, я понял, что сделал уродливую ошибку. Я не изменен локально никаких проблем после того, как я установил свой источник с:Внесение изменений Git в общий репо

git commit -C HEAD -a --amend 

После этого я попробовал другой мерзавец нажимной происхождение, и я получаю следующее сообщение об ошибке:

! [rejected]  mybranch -> mybranch (non-fast forward) 

Какой самый лучший способ это исправить ситуация?

ответ

7

git does not (по умолчанию) позволяет вам нажимать на ветвь что-нибудь, что «перематывает» кончик ответвления. Другими словами, если текущая ветвь ветви не является прямым родителем или предком кончика ответвления, то нажатие будет отклонено.

Вы можете попытаться в любом случае попытаться использовать параметр -f для git push или с помощью refspec с ведущим «+», например. git push origin +mybranch:mybranch.

Обычно удаленные хранилища все равно не позволят этому произойти, потому что вы рискуете потерять фиксации, если разные люди могут без разбора нажимать подсказки ветви, которые не включают в себя фиксации, которые у них отсутствуют на локальном компьютере.

Вы можете переопределить это поведение, изменив параметр конфигурации receive.denyNonFastForwards в удаленном репозитории (при условии, что у вас есть подходящий доступ к удаленному репозиторию).

Если у вас нет такого доступа, вы можете получить может, удалив удаленную ветку и воссоздавая ее.

например.

git push origin :mybranch 
git push origin mybranch 

Обратите внимание, что более поздние версии мерзавца включают параметр конфигурации receive.denyDeletes, который, если установлено, предотвратить это потенциально опасный обходной путь от работы.

+0

Ничего, я не знал о denyNonFastForwards: Я предположил, что вам нужен крючок для обеспечения этого. – araqnid

5

Если вы хотите заставить толчок, вы можете ... ehm ... пройти --force до push.

Однако, как правило, считается неправильной формой для перезаписи истории в публичном репозитории.

0

Если предположить, что общий репозиторий позволяет, просто префикс имя ветви со знаком плюс, чтобы заставить, не быстро вперед толчок:

git push origin +mybranch 
2

В данном случае это, вероятно, лучше всего, чтобы сделать второй совершить с исправить. Поскольку вы уже изменили первоначальную фиксацию в своем локальном репозитории, вы, вероятно, захотите вытащить ее из общего хранилища и переместить HEAD, чтобы ваша измененная фиксация могла быть собрана в мусор.

Смежные вопросы