Ошибка Git push: «Обновления без ускоренной перемотки вперед были отклонены»


99

Я редактировал свои репозитории GIT через Git Online. После того, как я попытался внести изменения в свой локальный код, у меня возникла ошибка:

Git push failed, To prevent from losing history, non-fast forward updates were rejected.

Как я могу это исправить?


Ответы:


137

Сначала потяните изменения:

git pull origin branch_name

1
Если это не решит вашу проблему, убедитесь, что вы нажимаете ту же ветку, что и та, над которой вы сейчас работаете. Проверьте, в какой ветке вы находитесь, с помощью «git status».
Афилина

1
Эта команда сработала у меня, но я хотел бы знать, почему это не так git pull:? Пульт дистанционного управления равно origin, так что на самом деле работает: git pull origin. Разве не следует обновлять все ветки?
Карлен Кишмирян

83

Добавьте --force в свою командную строку, если вы уверены, что хотите нажать. Например, используйте git push origin --force(я рекомендую командную строку, поскольку вы найдете гораздо больше поддержки от других пользователей с помощью командной строки. Также это может быть невозможно с SmartGit.) См. Этот сайт для получения дополнительной информации: http://help.github.com/ пульты /


8
--force решит ваши проблемы, но потенциально может навредить другим. Его следует использовать только с большой осторожностью (и знаниями)
schoetbi

7
-1 потому что форсировать пуш - вообще ужасная идея.
joshin4colours

6
+1, потому что 5 человек согласились с @ joshin4colours дать -1. Но хотя принудительное нажатие не всегда является лучшей идеей (что git ясно дает понять, отрицая ваш push), если бы это было плохой идеей в 100% случаев, такой возможности не существовало бы. Предложение Мэтта, безусловно, может быть полезно другим.
user1271772

2
Не стесняйтесь использовать, --forceесли вы единственный, кто использует эту ветку. Однако это вызывает проблемы при совместном использовании ветки с другими разработчиками.
Роберт Бризита

22

Перед тем, как нажимать, выполните команду git pull с опцией rebase. Это позволит получить изменения, которые вы внесли онлайн (в своем источнике), и применить их локально, а затем добавить свои локальные изменения поверх них.

git pull --rebase

Теперь вы можете нажать на удаленный

git push 

Для получения дополнительной информации см. Объяснение Git rebase и главу 3.6 Git Branch - Rebasing .


2
В моем случае git pull --rebaseзаканчиваетсяThere is no tracking information for the current branch. Please specify which branch you want to rebase against.
trejder

17

Я столкнулся с той же ошибкой, просто добавьте в команду "--force" , работает

git push origin master --force

6
есть ли у этого последствия?
jayunit100

8
потеря обязательств других.
Джованни Торальдо

1
У меня была странная ситуация, когда это именно то , что я хотел сделать ... взорвать содержимое только что созданной удаленной главной ветки чем-то новым. Это решило мою проблему. Хотя это решение не для всех, оно --forceможет быть полезным.
Брэд

1
Я не думаю, что этот ответ заслуживает того, чтобы его проголосовали против 6 раз. Это допустимое решение предоставленной проблемы, однако автор мог бы дать более подробное описание обстоятельств, при которых эта команда была бы полезна. Если об этом стоит упомянуть, так как это стоило написать (функциональность для --force)
Эйден Стридом

5

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

После

git branch branch_name --set-upstream-to=origin/branch_name
git pull

и разрешив конфликты слияния, я смог подтолкнуть.


Похоже, вы пропустили изменения в удаленной ветке
ozma 07

5

Вы можете добавить к команде --force-with-lease , она будет работать.

git push --force-with-lease

--force деструктивен, потому что он безоговорочно перезаписывает удаленный репозиторий тем, что у вас есть локально. Но --force-with-lease гарантирует, что вы не перезаписываете чужую работу.

См. Дополнительную информацию здесь .


1

(Одно) Решение для Netbeans 7.1: попробуйте потянуть. Вероятно, это тоже не удастся. Теперь загляните в журналы (обычно они теперь отображаются в IDE). Есть одна / несколько строк:

"Ошибка извлечения из-за этого файла:"

Найдите этот файл, удалите его (предварительно сделайте резервную копию). Обычно это файл .gitignore, поэтому вы не будете удалять код. Повторите нажатие. Теперь все должно работать нормально.


1

Использование этой --rebaseопции сработало для меня.

  • git pull <remote> <branch> --rebase

Потом нажимаем на репо.

  • git push <remote> <branch>

Например

git pull origin master --rebase

git push origin master


0

У меня была такая же проблема. Я решил с

git checkout <name branch>
git pull origin <name branch>
git push origin <name branch>

3
OP говорит о внесении изменений в местный код. checkoutперезапишет эти изменения или, по крайней мере, не будет включать их в push.
Trejder 02

0

Это то, что у меня сработало. Его можно найти в документации git здесь

Если вы находитесь в нужной ветке, вы можете сделать это:

git fetch origin
# Fetches updates made to an online repository
git merge origin YOUR_BRANCH_NAME
# Merges updates made online with your local work

0

Обнаружена та же проблема, чтобы решить ее, выполните следующие gitкоманды.

  • git pull {url} --rebase
  • git push --set-upstream {url} master

Вы должны сначала создать репозиторий на github.


0

Иногда, когда вы беретесь из своего git, HEAD отсоединяется. Вы можете проверить это, введя команду:

git branch 
  • (HEAD отделен от 8790704)

    мастер

    развиваться

Лучше перейти в свою ветку и по-новому взглянуть на соответствующую ветку.

git checkout develop

git pull origin develop

git push origin develop
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.