Як об'єднати віддалені зміни в 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" створить об'єднання 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
Дякую! Я підштовхнув гілку "А" до моєї програми Heroku, щоб перевірити деяку функціональність у виробничому середовищі. Тоді (локально) я об'єднав "А" та "В" у "майстер" і хотів підштовхнути "майстра" у свій додаток для постановки. Мав усілякі проблеми. Це зробило штовхання "господаря" дуже просто. Дякую!
Дон Літхем

Працював і для мене. Щоб знайти проблему, мені знадобилося 4 години. Дуже дякую. Я запускаю Netbeans на локальній машині (Windows 7) і хотів кожного натискання на локальній, перевіряти на віддаленій машині (Linux).
Максим Шустін

Зауважте, що цей метод може бути не безпечним, і це може призвести до недосяжності деяких розбіжних зобов'язань.
самуїл

Це має бути прийнятим рішенням. Інші рішення для мене не
спрацювали

20

Напевно у вас є зміни на github, які ви ніколи не зливали. Спробуйте git pullотримати та об'єднати зміни, тоді ви повинні мати можливість натиснути. Вибачте, якщо я неправильно зрозумів ваше запитання.


18
Якщо вам потрібно відхилити зміни у віддаленому
майстрі

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 add $ the_file_under_error

git фіксувати

git pull
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.