Как заставить 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
) сработало.