Что означает «отклоненные обновления Git push без отклонения»?

153

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

Не удалось отправить некоторые ссылки на <repo>. Чтобы предотвратить потерю истории, обновления без ускоренной пересылки были отклонены. Объедините удаленные изменения перед повторным нажатием.

Что может быть причиной этого и как я могу это исправить?

РЕДАКТИРОВАТЬ:

Вытягивание репо возвращает следующее:

* ветка master-> master (без ускоренной перемотки вперед) Уже в актуальном состоянии

Нажатие по-прежнему дает мне вышеупомянутую ошибку.

Моше
источник

Ответы:

136

В GitHub есть хороший раздел под названием « Работа с ошибками, не требующими перемотки вперед »

Эта ошибка может быть немного подавляющей на первый взгляд, не бойтесь.
Проще говоря, git не может сделать изменения на пульте без потери коммитов, поэтому он отклоняет push .
Обычно это вызвано тем, что другой пользователь нажимает на ту же ветку. Вы можете исправить это, извлекая и объединяя удаленную ветвь, или используя pull для одновременного выполнения обоих действий.

В других случаях эта ошибка является результатом деструктивных изменений, сделанных локально с помощью команд типа git commit --amendили git rebase.
Хотя вы можете переопределить пульт, добавив --forceк pushкоманде, вы должны делать это только в том случае, если вы абсолютно уверены, что это именно то, что вы хотите сделать.
Принудительные нажатия могут вызвать проблемы для других пользователей, которые загрузили удаленную ветвь, и это считается плохой практикой. Если есть сомнения, не форсируйте .


Git не может вносить изменения на удаленном компьютере, как слияние с перемоткой вперед, которое иллюстрирует справочник по Visual Git :

альтернативный текст

Это не совсем ваш случай, но помогает понять, что такое «ускоренная перемотка вперед» (где HEADветвь просто перемещается в новый более поздний коммит).


« branch master->master (non-fast-forward) Already-up-to-date» Обычно для локальных филиалов, которые не отслеживают свою удаленную коллегу.
Посмотрите, например, на этот SO вопрос « git pull говорит, что он актуален, но git push отклоняет не-ускоренную перемотку вперед ».
Или две ветви связаны, но не в соответствии с их историей:
см. « Бесконечная история GIT - что я здесь не так делаю? »

Это означает, что ваша ветка subversion и ваша удаленная ветка master git ни о чем не договариваются.
Некоторое изменение было перенесено / зафиксировано для одного, которого нет в другом.
Запустите gitk --all, и это должно дать вам ключ к пониманию того, что пошло не так - ищите «вилки» в истории.

VonC
источник
53

Это означает, что в удаленный репозиторий были переданы другие коммиты, которые отличаются от ваших коммитов. Обычно это можно решить с помощью

git pull

прежде чем нажать

В конечном счете, «ускоренная перемотка вперед» означает, что коммиты могут применяться непосредственно поверх рабочего дерева без слияния.

minichate
источник
2
Это то, что сработало для меня! Я забыл, что я изменил readme.md на сайте хранилища!
Райанвинчестер
14

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

bdukes
источник
8

в этом случае вы можете использовать силу с принудительной операцией

git push origin master --force

uspinar
источник
1
Это не правильно. общий источник github будет удален и выдвинут только ваш новый источник старый источник удален
logeshpalani98
6

Никогда не делай, git -fчтобы делатьpush потому что это может привести к последующим катастрофическим последствиям.

Вам просто нужно сделать git pullиз вашего местного филиала.

Пример:

git pull origin 'your_local_branch'

а затем сделать git push

Абхишек Томас
источник
0

Вам нужно объединить и разрешить, conflicts locallyпрежде чем вы передадите свои изменения в удаленное репо / форк.

1) тянуть (извлекать и объединять)

$ git pull remote branch 

2) Нажмите изменения

$ git push remote branch 

Тем не менее, у вас есть быстрый выбор pushпринудительного использования --forceопции, но его следует избегать, так как это может привести к потере изменений или негативно повлиять на других участников.

Мухаммед Солиман
источник