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

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

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

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

8 ответов

Сообщение означает, что вам не разрешено делать толчок без ускоренной перемотки вперед.

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

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

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

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

git revert [commit] создаст новый коммит, который отменяет все [commit] сделал.

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

git push -f myrepo my-branch

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

В выводе командной строки git из-за неудачного нажатия найдите строку, которая говорит что-то вроде:

error: failed to push some refs to 'ssh://user@some-remote-server.mycompany.com/srv/git/myrepo.git

затем

ssh user@some-remote-server.mycompany.com
cd /srv/git/myrepo.git
vi config

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

В "конфиге" установите

[receive]
        denyNonFastforwards = false

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

git push -f myrepo my-branch

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

git push origin master -f

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

git push origin master --delete
git push origin master

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

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

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

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

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

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

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

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

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

перейдите в исходную папку, затем запустите команды: 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**

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

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

Дайте соответствующее название филиала для местозаполнителя - MYBRANCH

Другие вопросы по тегам