Что означает "Git push non-fast-forward updates были отклонены" означает?
Я использую Git для управления двумя компьютерами и моей разработкой. Я пытаюсь внести изменения в GitHub, и я получаю сообщение об ошибке.
Не удалось нажать несколько ссылок на <repo>
. Чтобы предотвратить потерю истории, обновления, не связанные с быстрой пересылкой, были отклонены. Слейте удаленные изменения перед повторным нажатием.
Что может быть причиной этого и как я могу это исправить?
EDIT:
Вытягивание репо возвращает следующее:
* branch master- > master (без перемотки вперед) Уже-уточненный
Нажатие еще дает мне вышеупомянутую ошибку.
Ответы
Ответ 1
GitHub имеет хороший раздел под названием " Работа с ошибками" без перемотки вперед"
Эта ошибка может сначала быть подавляющей, не бойтесь.
Проще говоря, git не может внести изменения на пульте дистанционного управления без потери фиксации, поэтому он отказывается от нажатия.
Обычно это вызвано тем, что другой пользователь нажал на одну ветвь. Вы можете исправить это, извлекая и объединяя удаленную ветку, или используя pull для выполнения обоих сразу.
В других случаях эта ошибка является результатом деструктивных изменений, сделанных локально с помощью команд типа git commit --amend
или git rebase
.
Хотя вы можете переопределить удаленный доступ, добавив --force
в команду push
, вы должны сделать это, только если вы абсолютно уверены, что это то, что вы хотите сделать.
Силовые нажатия могут вызвать проблемы для других пользователей, которые извлекли удаленную ветвь, и считаются плохой практикой. Если вы сомневаетесь, не нажимайте.
Git не может вносить изменения на пульте дистанционного управления, например, ускоренное слияние, которое Visual git Reference иллюстрирует:
Это не совсем ваше дело, но помогает понять, что такое "быстрая перемотка вперед" (где HEAD
ветки просто перемещается в новую более позднюю фиксацию).
" branch master->master (non-fast-forward) Already-up-to-date
" обычно используется для локальных ветвей, которые не отслеживают их удаленную контр-часть.
См. Например, этот вопрос SO "Git pull говорит обновленный, но git push отклоняет непереходную вперед.
Или две ветки связаны, но в несогласии с их соответствующей историей:
См. "Бесконечная история git - что я здесь делаю неправильно?
Это означает, что ваша ветка subversion и удаленная ветка git не согласны. Некоторые изменения были перенесены/преданы тому, который не находится в другом.
Запустите gitk --all
, и он должен дать вам представление о том, что пошло не так - ищите "вилки" в истории.
Ответ 2
Это означает, что в удаленном репозитории произошли другие коммиты, которые отличаются от ваших коммитов. Обычно вы можете решить эту проблему с помощью
git pull
прежде чем вы нажмете
В конечном счете, "быстрая перемотка вперед" означает, что коммиты могут применяться непосредственно поверх рабочего дерева без необходимости слияния.
Ответ 3
Я нашел это описание быстрой перемотки вперед наиболее ясным.
http://365git.tumblr.com/post/504140728/fast-forward-merge
Ответ 4
Быстрое переадресационное обновление - это то, где изменяется только одна из сторон после последней фиксации на другой стороне, поэтому нет необходимости слияния. Это говорит о том, что вам нужно объединить свои изменения, прежде чем вы сможете нажать.
Ответ 5
вы можете использовать силу с нажатием кнопки в этом случае
git push origin master --force
Ответ 6
Никогда не делайте git -f
, чтобы сделать push
, так как это может привести к последующим катастрофическим последствиям.
Вам просто нужно сделать git pull
вашего локального ветки.
Пример:
git pull origin 'your_local_branch'
а затем сделайте git push
Ответ 7
Вам нужно объединить и разрешить conflicts locally
прежде чем вы отправите свои изменения в удаленное репо/ветвь.
1) тянуть (извлекать и объединять)
$ git pull remote branch
2) Нажмите изменения
$ git push remote branch
Тем не менее, у вас есть быстрый выбор принудительного push
с использованием --force
но его следует избегать, поскольку это может привести к потере изменений или негативно повлиять на других участников.