Как объединить удаленные изменения на GitHub?


137

Я получаю следующую ошибку при попытке первого нажатия на Github:

[rejected] master -> master (non-fast forward)
error: failed to push some refs to 'git@github.com:me/me.git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes before pushing again.  See the 'non-fast forward'
section of 'git push --help' for details.

как я могу исправить это и объединить удаленные изменения?

Ответы:


106

См. Подробности в разделе "без перемотки вперед" в git push --help .

Вы можете выполнить «git pull», разрешить потенциальные конфликты и «git push» получить результат. «Git pull» создаст коммит слияния C между коммитами A и B.

В качестве альтернативы вы можете перенастроить свое изменение между X и B поверх A с помощью «git pull --rebase» и вернуть результат обратно. Перебазирование создаст новую фиксацию D, которая создает изменение между X и B поверх A.


16
Я продолжаю сталкиваться с этим, за исключением того, что если я сделаю «git pull», мне сообщат: «Уже обновлено». и если я выполняю команду «git pull --rebase», мне говорят, что «текущий мастер ветки обновлен». Любые идеи? Благодарность!
jwl

3
@ larson4 У меня та же проблема, но после того, как вы сделаете это git pull, сделайте еще одну фиксацию, и тогда все должно быть хорошо
Патрик

20
@Patrick @larson У меня была аналогичная проблема, вызванная тем, что я не внимательно прочитал сообщение об ошибке. Отклонение было в ветке, которую я не проверял. Ветвь, в которой я был на самом деле, преуспевала. Решение было git checkout other-branch; git pull; git push; git checkout branch-i-was-working-on.
Ной Спурриер

86

Вы также можете принудительно нажать кнопку, добавив символ + перед именем вашей ветки.

git push origin +some_branch

1
Спасибо, у меня работает. Другие решения полностью стерли бы эффект моегоgit reset --hard
Оли

1
Благодарность! Я переместил ветку «A» в свое промежуточное приложение Heroku, чтобы протестировать некоторые функции в производственной среде. Затем (локально) я объединил «A» и «B» в «master» и хотел вставить «master» в свое промежуточное приложение. Были всевозможные проблемы. Это сделало толкать «мастера» очень простым. Благодарность!
Дон Литэм,

У меня тоже сработало. У меня ушло 4 часа, чтобы найти проблему. Большое спасибо. Я запускаю Netbeans на локальном компьютере (Windows 7) и хотел, чтобы при каждом нажатии на локальном компьютере проверялось на удаленном компьютере (Linux).
Максим Шустин

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

Это должно быть приемлемое решение. Другие решения у меня не работали
banarun

20

У вас, вероятно, есть изменения в github, которые вы никогда не объединяли. Попробуйте git pullполучить и объединить изменения, тогда вы сможете нажать. Извините, если я неправильно понял ваш вопрос.


18
Если вам нужно отклонить изменения в удаленном мастере и отправить свои собственные изменения, попробуйте нажать с ключом -f
Hotsyk

13

Если вы «git pull» и получаете сообщение «Уже обновлено», но по-прежнему получаете эту ошибку, это может быть связано с тем, что одна из ваших других веток устарела. Попробуйте переключиться на другую ветку и убедитесь, что одна из них также обновлена, прежде чем снова пытаться "git push":

Перейдите в ветку «foo» и обновите ее:

$ git checkout foo
$ git pull

Вы можете увидеть свои ветки, введя команду:

$ git branch

Вы можете объяснить, почему это работает и необходимо? (Это действительно решило мою проблему.) Мне это кажется нелогичным. Я не понимаю, зачем git нужна еще одна ветка, чтобы я мог нажимать на главную ветку.
Quinxy von Besiex

@QuinxyvonBesiex Я не уверен, что понимаю. Это может иметь какое-то отношение к базовой структуре самого Git и к тому, как он организует ветки (которые в основном идентичны тегам, насколько я понимаю).
Дэвид Калхун

7

Вы можете заставить его нажимать, но, пожалуйста, делайте это ТОЛЬКО тогда, когда вы совершенно уверены, что делаете.

Команда такая:

git push -f 

3

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

Вы можете решить эту проблему, удалив локальный тег:

$ git tag --delete foo_tag

2

Когда я получил эту ошибку, я сделал резервную копию всей папки проекта. Затем я сделал что-то вроде

$ git config branch.master.remote origin
$ git config branch.master.merge refs/heads/master

... в зависимости от имени вашей ветки (если она не является главной).

Тогда я сделал git pull --rebase. После этого я заменил извлеченные файлы файлами моего проекта из резервной копии. Теперь я готов снова зафиксировать свои изменения и нажать.


0

1) Принудительное вытягивание для перезаписи локальных изменений

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

Выполните следующие команды в своей среде IDE:

git reset - жесткий

git pull

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

2) Сохранение обоих изменений (локальных и репо)

Если вы хотите сохранить оба изменения (изменения, сделанные локально, и изменения, присутствующие в репозитории), вы можете добавить и зафиксировать свои изменения. Когда вы потянете, очевидно, будет конфликт слияния. Здесь вы можете использовать инструменты в вашей среде IDE (такие как Difftool и mergetool), чтобы сравнить два фрагмента кода и определить, какие изменения следует сохранить, а какие удалить. Это средний путь; никакие изменения не будут потеряны, пока вы не удалите их вручную.

git добавить $ the_file_under_error

git commit

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