Эгит отклонил без перемотки вперед

89

Я получаю это сообщение при отправке в репозиторий github. Подскажите пошаговую процедуру, как это исправить? Я нажал только один раз, и все прошло успешно. Но когда я обновил проект и попытался отправить свою вторую фиксацию, он показывает «мастер отклонил без перемотки вперед» и не позволяет мне нажать. Пожалуйста, объясните процедуру.

Джей
источник
У меня такая же проблема после создания нового репо с помощью «Инициализировать этот репозиторий с помощью README». Я удалил его и снова создал без этого чечбокса.
Эндрю
@andrew прав
Dany Wehbe

Ответы:

227

У меня была такая же проблема, и я смог ее исправить. afk5min был прав, проблема в том, что ветка, из которой вы вытащили код, с тех пор изменилась в удаленном репозитории. В соответствии со стандартной практикой git ( http://git-scm.com/book/en/Git-Basics-Working-with-Remotes ) вам нужно (сейчас) объединить эти изменения в удаленном репозитории с вашими локальными изменениями, прежде чем вы может совершить. В этом есть смысл, это вынуждает вас принимать изменения других и объединять их в свой код, гарантируя, что ваш код продолжит работать с другими изменениями на месте.

В любом случае, по ступенькам.

  1. Сконфигурируйте "выборку" для извлечения ветки, из которой вы изначально извлекли.

  2. Получите удаленную ветку.

  3. Объедините эту удаленную ветку с вашей локальной веткой.

  4. Зафиксируйте изменение (слияние) в своем локальном репо.

  5. Отправьте изменение в удаленное репо.

В деталях...

  1. В eclipse откройте представление «Репозитории Git».

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

  3. Ищите зеленую стрелку, указывающую влево, это стрелка «выборки». Щелкните правой кнопкой мыши и выберите «Настроить выборку».

  4. Вы должны увидеть URI, убедитесь, что он указывает на удаленный репозиторий.

  5. Посмотрите во всплывающем окне в разделе сопоставлений ссылок. Моя была пуста. Это укажет, какие удаленные ссылки вы хотите получить. Щелкните "Добавить".

  6. Введите имя ветки, которую нужно получить из удаленного репозитория. Мой был «мастером» (кстати, выпадающий список здесь был бы отличным !!, пока вы должны его ввести). Продолжайте во всплывающем окне, в конце концов нажав «Готово».

  7. Нажмите "Сохранить и получить". Это позволит получить эту удаленную ссылку.

  8. Поищите в папке «Филиалы» вашего локального репозитория. Теперь вы должны увидеть эту удаленную ветку в удаленной папке. Я снова вижу «хозяина».

  9. Щелкните правой кнопкой мыши локальную ветвь в папке «Local» раздела «Branch», которая называется «master». Выберите «Объединить», а затем выберите удаленную ветку с именем «origin / master».

  10. Процесс через слияние.

  11. Зафиксируйте любые изменения в вашем локальном репозитории.

  12. Отправьте свои изменения в удаленный репозиторий.

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

Роберт Бендер
источник
7
Это должно быть отмечено как ответ. Работал как шарм. Эта проблема возникает, даже если я не добавлял никаких файлов (обычный файл README) при создании репозитория на GitHub для моего проекта в Eclipse. Большое спасибо за простое пошаговое объяснение.
rbaleksandar 03
На решение этой проблемы у меня ушел год, пока я не прочитал ваш пост. В моем случае у меня не было пульта ДУ, но Eclipse создал пульт по умолчанию под названием origin.
Юджин ван дер Мерве
Милая, наконец-то я могу объединиться с Eclipse. Ключевым моментом здесь является использование представления Git Repositories для выполнения слияния, а не обычного представления Team Synchronize. Было бы хорошо, если бы в команде синхронизации представления eGit мог отключить все параметры, которые ничего не делают.
Дэн Картер
1
Хотя это действительно работает, создается ненужная фиксация слияния. Здесь вы должны использовать rebase, что нормально, потому что ваши изменения являются только локальными, поэтому вы не меняете какую-либо опубликованную историю (и если вы это сделаете, git все равно будет кричать на вас, чтобы не перемотать вперед). Мне нравится ответ MYN.
nyuszika7h
1
Щелкните правой кнопкой мыши проект, а затем Mergeв мастере, а затем щелкните правой кнопкой мыши еще раз на проекте, который push branch Masterработал
user1207289
17

В моем случае я установил Force Updateфлажок при нажатии. Оно работало завораживающе.

BSeitkazin
источник
Это сработало и для меня. У меня было состояние OP после «изменения» фиксации. И fetch дал мне "нечего принести"
Twilite
11

Тем временем (пока вы обновляли свой проект) в ветку master были внесены другие коммиты. Следовательно, вы должны сначала извлечь эти изменения, чтобы иметь возможность протолкнуть свои изменения.

afk5min
источник
4
в этом случае git довольно глупый, я перенес все изменения на пульт. и я единственная работаю над проектом. Зачем мне нужно вытащить пульт, прежде чем я смогу снова нажать ???? Изначально
потянутая
7

Применимо для Eclipse Luna + Eclipse Git 3.6.1

Я,

  1. клонированный репозиторий git
  2. внес некоторые изменения в исходный код
  3. поэтапные изменения из Git Staging View
  4. наконец, зафиксируйте и нажмите!

И я столкнулся с этой проблемой с EGit, и вот как я ее исправил ...

Да, кто-то зафиксировал изменения, прежде чем я зафиксирую свои изменения. Так что изменения отклонены. После этой ошибки изменения фактически фиксируются в локальном репозитории. Я не хотел просто Pullвносить изменения, потому что хотел сохранить, linear historyкак указано в - В каких случаях `git pull` может быть вредным?

Итак, я выполнил следующие шаги

  1. с точки зрения репозитория Git щелкните правой кнопкой мыши соответствующий
    проект Git
  2. select Fetch from Upstream- извлекает удаленные обновления (ссылки и объекты), но локальные обновления не производятся. для получения дополнительной информации см. В чем разница между «git pull» и «git fetch»?
  3. select Rebase...- это открывает всплывающее окно, нажмите, чтобы Preserve merges during rebaseузнать, почему.
    Что именно делает git "rebase --preserve-merges" (и почему?)
  4. нажмите на Rebase button
  5. если есть / есть conflict(s), переходите к шагу 6, иначе шагу 11
  6. появится Rebase Resultвсплывающее окно, просто нажмите наOK
  7. file comparatorоткроется, нужно доработать left side file.
  8. как только вы закончите слияние изменений правильно, перейдите к Git Stagingпросмотру
  9. stage the changes. т.е.add to index
  10. в том же виде щелкните Rebase-> Continue. повторите от 7 до 10, пока все конфликты не будут разрешены.
  11. в Historyпредставлении выберите строку фиксации и выберитеPush Commit
  12. установите Rebase Commits of local.......флажок и нажмите «Далее». см. почему - Git: переустановить на ветку разработки из апстрима
  13. нажмите на Finish

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

Йогеш Манваре
источник
Я согласен с использованием перебазирования вместо слияния. Это лучше, поскольку это не создает ненужного коммита слияния. (Не по теме: Stack Overflow совершенно смешно и отклоняет мой комментарий исключительно на основании того факта, что я изначально написал «+1 за». Мой комментарий совершенно конструктивен, спасибо.)
nyuszika7h
4

Настроить После нажатия кода, когда вы получите отклоненное сообщение, нажмите кнопку «Настроить» и нажмите «Добавить спецификацию», как показано на этом рисунке.

Ссылка на источник и ссылка на место назначения В раскрывающемся списке щелкните ссылку ref / Heads / yourbranchname и снова нажмите Добавить спецификацию.

введите описание изображения здесь Убедитесь, что вы выбрали принудительное обновление

введите описание изображения здесь Наконец, сохраните и отправьте код в репо

Винила Тонупунури
источник
3

Откройте git view:

1- выберите свой проект и выберите слияние 2- Выберите удаленное отслеживание 3- нажмите ОК

Git объединит удаленную ветку с локальным репозиторием

4- затем нажмите

Дафали
источник
2

Эта ошибка означает, что в удаленном репозитории были другие коммиты и он опередил вашу локальную ветку.
Я пытаюсь выполнить git pull, а затем git push. Если нет конфликтующих изменений, git pull получает последний код в мою локальную ветку, сохраняя при этом мои изменения нетронутыми.
Затем git push отправляет мои изменения в основную ветку.

Пушкин
источник
кажется, многим не хватает этого простого решения: D
Black
0

Я обнаружил, что у вас должна быть последняя фиксация git. Итак, следующие шаги: 1) убедитесь, что вы не работали с одними и теми же файлами, иначе вы столкнетесь с ошибкой DITY_WORK_TREE. 2) вытащить последние изменения. 3) зафиксируйте свои обновления.

Надеюсь это поможет.

Могучий элементаль
источник
-1
  1. Зайдите в Github и создайте репозиторий для вашего нового кода.
  2. Используйте новый URL-адрес https или ssh в Eclise, когда вы выполняете push для восходящего потока;
Адриан Филипеску
источник