Наша удаленная главная ветка как-то испортилась. Текущий код разработки находится в основной ветке вместе с последними коммитами. Очевидно, что код разработки не готов для основной ветки.
Итак, в моем локальном репозитории я сбросил до последней версии тега 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)'
Я не могу использовать master, потому что он содержит код разработки, который не может быть на master.
denyNonFastforwards = true
. Я изменил его на false, подтолкнул свои изменения, а затем снова изменил его на true. Еще раз спасибо всем за помощь.Ответы:
Сообщение означает, что вам не разрешено выполнять нажатие без перемотки вперед.
Скорее всего,
denyNonFastforwards = true
в вашем удаленном репозитории в config. Если вы измените это,git push --force
должно работать.Чтобы изменить настройку, вам потребуется доступ к машине с удаленным репозиторием. Оттуда делай
git config receive.denynonfastforwards false
.источник
git config
для сервера? Или, возможно, вы использовали это метафорически. Чтобы поиграть с этими идеями, я создал тестовое репо в/opt/git
(пространство моего сервера git), а затем изменил этот параметр в/opt/git/the_repo/the_repo.git/config
. Но после того, как сделал,git push --force origin SHA:branch
работал по мере необходимости.Пульт дистанционного управления не допускает перемотки вперед.
Ваш лучший вариант - выполнить
git revert
все коммиты, которых не должно быть, и будьте осторожнее в будущем.git revert [commit]
создаст новый коммит, который отменяет все, что было[commit]
сделано.источник
Действия по постоянному включению принудительного толчка в следующем стиле
Отредактируйте файл с именем «config» в папке, заканчивающейся на «.git», в удаленном репозитории.
В выводе командной строки git после неудачного нажатия найдите строку, которая говорит что-то вроде:
затем
Установите для denyNonFastforwards значение false
В "config" установите
Теперь вы можете нажать с локального компьютера с помощью -f
источник
git revert
это довольно сложно, когда у вас есть слияния. Чтобы быть более сложным, в моем случае есть 3 слияния, одно из которых связано с очень старым ~ 20 коммитом, отличным от разработки, второе - это своего рода слияние от мастера - уродливо, как черт.Попробуйте использовать
-f
флаг и поставить его после имени удаленной ветки.git push origin master -f
источник
git push -f origin master
и результат тот же. Оба раза я пробовал, но получил вторую версию сообщения об ошибке.Вам не разрешено делать git push без перемотки вперед.
Если удаленным является GitHub, перейдите в
https://github.com/$USER/$REPO/settings/branches
соответствующую ветку и снимите защиту.Для этого вы должны быть администратором репо.
Если пульт - ваш собственный сервер git, запустите
git config receive.denynonfastforwards false
его.источник
Лучший способ обойти это - удалить удаленную ветку и повторно отправить ее:
источник
Проблема возникает, поскольку текущая ветвь не настроена должным образом для PULL . Сначала проверьте, правильно ли настроена восходящая ветвь для вытягивания, используя -
git remote show origin
. Вы можете найти его в разделе - Локальные ветви , настроенные для «мерзавца тянуть»: . Если нет, настройте его, используя:Дайте подходящее название ветки для заполнителя - MYBRANCH
источник
Я использую эту группу команд для сброса моего удаленного репо, это повторно инициализирует ваше локальное репо и повторно связывается с вашим удаленным репо, а затем принудительно отправляет обновления.
Думаю, в вашем случае этот способ не сработает, но может быть полезен кому-то другому
перейдите в исходную папку, затем запустите команды: обратите внимание, что
https://github.com/*.git
это ваша ссылка удаленного репо**Note: this will clear all your git history on your master branch**
источник
Для меня подсказка @svick указала в правильном направлении. Поскольку git-сервер, который я хотел изменить, на самом деле является моим ящиком, я вошел в него и сделал,
git config --global receive.denynonfastforwards false
чтобы изменить все репозитории, чтобы принять принудительное нажатие не-ff. Не вышло из коробки. Я обнаружил, что в конфиге он уже былreceive.denynonfastforwards=true
установлен, и его нельзя стереть с помощьюgit config --global --unset receive.denynonfastforwards
. Однако редактирование в репо вручную (vi config
) сработало.источник
Я решил, удалив основную ветку из защищенной, а также по умолчанию, которая немного превышает правила защищенной ветки в настройке репозитория.
источник