Как заставить принудительно выполнить сброс в удаленный репозиторий?
Наш удаленный мастер-филиал как-то запутался. Текущий код разработки находится в основной ветке вместе с последними коммитами. Очевидно, что код разработки не готов к основной ветке.
Итак, в моем локальном хранилище я сделал сброс до последней метки, 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 без быстрой перемотки вперед.
Если удаленным является GitHub, перейдите на
https://github.com/$USER/$REPO/settings/branches
и снимите защиту с рассматриваемой ветви.Вы должны быть администратором репо, чтобы сделать это.
Если удаленным является ваш собственный сервер 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