2012-05-11 4 views
69

Наш удаленный мастер-филиал как-то перепутался. Текущий код разработки находится на главной ветке вместе с последними коммитами. Очевидно, код разработки не готов к мастер-ветви.Как принудительно нажать сброс в удаленный репозиторий?

Так что в моем локальном хранилище я сделал сброс до последнего тега, git reset --hard (Tag). Ведущая ветка теперь корректна в моем локальном репозитории. Теперь, когда я пытаюсь раздвинуть изменения на удаленное хранилище, git push origin master, я получаю сообщение об ошибке:

To (REMOTE GIT REPOSITORY LOCATION) 
! [rejected]  master -> master (non-fast-forward) 
error: failed to push some refs to '(REMOTE GIT REPOSITORY LOCATION)' 
To prevent you from losing history, non-fast-forward updates were rejected 
Merge the remote changes (e.g. 'git pull') before pushing again. See the 
'Note about fast-forwards' section of 'git push --help' for details. 

Так осмотрев я узнал вариант --force. Так что я сделал усилие толчок на удаленном хранилище, git push --force origin master, и я до сих пор получил ошибку:

Total 0 (delta 0), reused 0 (delta 0) 
remote: error: denying non-fast-forward refs/heads/master (you should pull first) 
To (REMOTE GIT REPOSITORY LOCATION) 
! [remote rejected] master -> master (non-fast-forward) 
error: failed to push some refs to '(REMOTE GIT REPOSITORY LOCATION)' 

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

+2

Я думаю, что сообщение означает, что у вас нет прав на выполнение непереходного нажатия. – svick

+1

Вы были верны, спасибо. В файле конфигурации для репозитория на удаленном компьютере 'denyNonFastforwards = true'. Я изменил его на false, нажал мои изменения, а затем изменил его на true. Еще раз спасибо, за помощь. – samwell

+2

@samwell, пожалуйста, отметьте ответ svick как принятый – hultqvist

ответ

9

Попробуйте использовать флаг -f и положить его после имени удаленной ветки.

git push origin master -f

+0

Нет, это тоже не сработало. Я также попробовал «git push -f origin master» и тот же результат. Оба раза я попробовал, я получил вторую версию сообщения об ошибке. – samwell

13

Пульт дистанционного управления не позволяет лицам, не ускоренная перемотка вперед.

Ваш лучший вариант - git revert все коммиты, которые не должны быть там и быть более осторожными в будущем.

git revert [commit] создаст новую фиксацию, которая отменяет все, что было сделано [commit].

+0

Это были некоторые настройки в удаленном репозитории, которые блокировали все изменения без перемотки вперед. – samwell

111

Сообщение означает, что вам не разрешено выполнять непереходное нажатие.

Ваш удаленный репозиторий имеет, скорее всего, denyNonFastforwards = true в своей конфигурации. Если вы измените это, git push --force должен работать.

Чтобы изменить настройки, вам необходимо получить доступ к устройству с удаленным репозиторием. Оттуда сделайте git config receive.denynonfastforwards false.

+1

Можете ли вы сделать 'git config' для сервера? Или, возможно, вы использовали это метафорически. Чтобы играть с этими идеями, я создал тестовое репо в '/ opt/git' (мое пространство сервера git), а затем я изменил этот параметр в'/opt/git/the_repo/the_repo.git/config'. Но после того, как вы сделали «git push -force origin SHA: branch», работали по мере необходимости. – HankCa

+4

Сообщение об ошибке будет содержать строку, начинающуюся с «error: не удалось направить некоторые ссылки на <ваш репозиторий>», где <ваш репозиторий> - это путь, заканчивающийся на .git, который является каталогом, содержащим файл с именем «config». Этот «config» -файл - это где вы можете установить denyNonFastforwards = false – emery

+0

@emery, но если у кого-то нет доступа к серверу? – hsalimi

0

Проблема возникает, когда текущая ветка неправильно настроена для PULL. Сначала проверьте, правильно ли сконфигурирована ветвь вверх по потоку, используя - git remote show origin. Вы можете найти его в разделе - Локальные филиалы, настроенные для «git pull»:. Если нет, то настроить его с помощью:

git config branch.MYBRANCH.merge refs/heads/MYBRANCH 

Дайте соответствующее имя ветви для держателя место - MYBRANCH

+1

Он не решает запретить быстрый переход вперед. –

9

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

git push -f myrepo my-branch 

Редактировать файл с именем «config» в папке, заканчивающейся на «.мерзавец "на удаленном хранилище

В выходе из командной строки Git и от несостоявшегося толчка, обратите внимание на строку, которая говорит что-то вроде:

error: failed to push some refs to 'ssh://[email protected]/srv/git/myrepo.git 

затем

ssh [email protected] 
cd /srv/git/myrepo.git 
vi config 

Set" denyNonFastforwards "на значение false

В" config ",

[receive] 
     denyNonFastforwards = false 

Теперь вы можете нажать с локального компьютера с -f

git push -f myrepo my-branch 
+0

Как это сделать без доступа к SSH для обнажения git repo? –

+0

Может быть, использовать команду git revert, как предлагает richo? Если вы сначала поддерживаете текущее состояние репо, вы все равно можете объединить свой код в движении вперед. – emery

+0

'git revert' довольно сложно, когда у вас есть слияния. Чтобы быть более сложным, мой случай имеет 3 слияния, из которых один с очень старым ~ 20, который расходится с развитием, второй - это слияние с хозяином - уродливое, как ад. –

2

Вам не разрешено делать GIT толчок, который не является быстрой перемотки вперед.

  1. Если пульт ДУ GitHub, перейдите https://github.com/$USER/$REPO/settings/branches и снимите защиту сук под вопросом.

    enter image description here

    Вы должны быть админом репо, чтобы сделать это.

  2. Если пульт дистанционного управления является вашим собственным сервером git, запустите git config receive.denynonfastforwards false.

+0

Имейте в виду, что для экземпляров Git Hub Enterprise нажатие на ветвь по умолчанию (обычно «master») может быть отключено на уровне экземпляра. Это означает, что даже если «мастер» не защищен, и даже если вы являетесь администратором сайта, вы не сможете делать принудительные нажатия на ветвь по умолчанию. Предполагая, что у вас есть разрешения, вы можете временно обойти это, переключив ветвь по умолчанию на что-то еще, сделав принудительное нажатие, а затем переключитесь обратно. –

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