2012-03-23 4 views
54

Я знаю, что люди задавали подобные вопросы, но я считаю, что причины их проблем будут разными. Я сделал жесткий сброс, потому что я испортил мой код довольно плохоgit push reject: ошибка: не удалось нажать некоторые ссылки

git reset --hard 41651df8fc9 

Я сделал довольно некоторые изменения, я сделал несколько коммитов и теперь, когда я пытаюсь нажать все эти коммиты на сервер Я получаю следующее сообщение об ошибке:

! [rejected]  master -> master (non-fast-forward) 
error: failed to push some refs to '[email protected]' 

Git предлагает сделать GIT тянуть и то, что другие люди предложили другим пользователям. Тем не менее, я считаю, что git pull объединит мой текущий код с кодом, который мне больше не нужен (пересмотр главы). Как я могу сделать толчок и забыть о версии/ревизиях впереди?

ответ

90

git push -f если у вас есть разрешение, но это испортит всех, кто вытащит из этого репо, поэтому будьте осторожны.

Если отрицается, и у вас есть доступ к серверу, так как canzar говорит ниже, вы можете разрешить это на сервере с

git config receive.denyNonFastForwards false 
+0

Я предполагаю, что у меня нет разрешения «удаленный : ошибка: отказ от быстрого переадресации refs/heads/master (вы должны сначала вытащить). «Я единственный, кто работает над этим репо в данный момент, поэтому меня не беспокоят никакие другие ветви или что-то еще. Есть идеи? – Eric

+0

Если вы единственный человек, владеющий этим репо, просто используйте 'git push -f', который будет использовать ваше текущее репо вместо удаленного. Если есть многопользовательская разработка, ускоренная перемотка вперед необходима, в противном случае очень легко будет отвращение. – Tim

+1

Если вы можете войти в систему на удаленном компьютере, вы можете перейти прямо в голый git repo и вручную перемотать ветвь с помощью 'git branch -f', например,' git branch -f rewind_the_one_I_broke 8120307'. Вы можете запустить 'git log' в режиме открытого репо, чтобы найти точку сброса. Обратите внимание, что это имеет тот же эффект, что и git push -f, но обходит крючки. – torek

23

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

git checkout master 
git push origin +HEAD 

Это позволит установить наконечник происхождения/мастер, к тому же совершить в качестве ведущего (и так удалить коммиты между 41651df и происхождением/мастером)

+0

избавится от кода, который мне больше не нужен, и сохраните мой новый код? (извините, если это глупый ответ) – Eric

+2

это установит верхушку оригинала/ведущего на тот же фиксатор, что и главный (и, таким образом, удалите фиксации между 41651df и origin/master) – ouah

+0

Обновите главную ветку исходного хранилища с вашим текущим HEAD, расположенным ветвь, позволяющая получать обновления без пересылки. Итак, это то же самое с 'git push HEAD -f'. Для меня, я думаю, вы можете использовать более мягкий способ сделать это, во-первых, использовать 'git fetch', после этого использовать' git rebase -i origin/master', это позволит вам выбрать коммиты. – Tim

4

'remote: error: denying non-fast-forward refs/heads/master (you should pull first)'

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

+1

Или, администратор запускает 'git branch -f', который имеет тот же эффект, но не требует суеты с крюком pre-receive. – torek

10

Вобще

git pull origin [branch] 

, а затем вы должны быть в состоянии нажать.

Если у вас есть фиксации по своему усмотрению и не толкать его ветвь еще, попробуйте

git pull --rebase origin [branch] 

, а затем вы должны быть в состоянии нажать.

0

Что я сделал, чтобы решить эту проблему, было:

git pull origin [branch] 
git push origin [branch] 

Также убедитесь, что вы направляете на правой ветви, запустив:

git remote set-url origin [url]