Как заставить push reset удаленный репозиторий?

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

Итак, в моем локальном репозитории я сделал reset до последнего тега 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)'

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

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

Шаги для непрерывного включения принудительного нажатия в следующем стиле

git push -f myrepo my-branch

Отредактируйте файл с именем "config" в папке, заканчивающейся ".git" в удаленном репозитории

В 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

Установите для параметра denyNonFastforwards значение false

В "config" установите

[receive]
        denyNonFastforwards = false

Теперь вы можете нажать с вашей локальной машины с помощью -f

git push -f myrepo my-branch

Ответ 4

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

git push origin master -f

Ответ 5

Вам не разрешается делать git push, который не является быстрым.

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

    введите описание изображения здесь

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

  • Если пульт - это ваш собственный сервер git, запустите git config receive.denynonfastforwards false.

Ответ 6

Лучший способ обойти это - удалить удаленную ветку и отправить ее заново:

git push origin master --delete
git push origin master

Ответ 7

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

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

Дайте соответствующее имя ветки для владельца места - MYBRANCH

Ответ 8

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

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

перейдите в исходную папку и выполните команды: обратите внимание, что https://github.com/*.git - это ваша ссылка для удаленного репо

git init
git remote add origin https://github.com/*.git
git add .
git commit -m "initial commit"
git push origin master -f
git push --set-upstream origin master

**Note: this will clear all your git history on your master branch**

Ответ 9

Для меня подсказка @svick указала в правильном направлении. Поскольку сервер git, который я хотел изменить, на самом деле является моей коробкой, я вошел в него и выполнил git config --global receive.denynonfastforwards false чтобы изменить все репозитории, чтобы они принимали принудительный push без использования ff. Не сработало из коробки. Я обнаружил, что в конфиге уже было установлено значение receive.denynonfastforwards=true, и его нельзя удалить с помощью git config --global --unset receive.denynonfastforwards. Выполнение редактирования в репозитории вручную (vi config) сработало.