Як об'єднати віддаленого майстра з місцевим відділенням


238

У мене є локальна гілка проекту ("configUpdate"), яку я відключив від чужого проекту, і я здійснив безліч змін, і я хотів би об'єднати зміни, які вони внесли до моєї локальної гілки.

Я намагався

git pull --rebase origin configUpdate

але він не захопив останні зміни - як я можу їх об'єднати? (також для бонусних очок, що я зробив з pull --rebaseкомандою?)


Відповіді:


354

З відділення функції (наприклад configUpdate) запустіть:

git fetch
git rebase origin/master

Або коротша форма:

git pull --rebase

Чому це працює:

  • git merge branchnameприймає нові фішки з гілки branchnameта додає їх до поточної гілки. Якщо потрібно, він автоматично додає комісію "Об'єднання" зверху.

  • git rebase branchnameбере нові комісії з гілки branchnameта вставляє їх "під" ваші зміни. Точніше, він модифікує історію поточної гілки таким чином, що вона базується на підказці branchname, з будь-якими змінами, які ви внесли поверх цього.

  • git pullв основному те саме, що git fetch; git merge origin/master.

  • git pull --rebaseв основному те саме, що git fetch; git rebase origin/master.

То чому б ви хотіли використовувати, git pull --rebaseа не git pull? Ось простий приклад:

  • Ви починаєте працювати над новою функцією.

  • На той момент, коли ви готові надіслати свої зміни, інші розробники відхилили кілька комітетів.

  • Якщо ви git pull(що використовує об'єднання), ваші зміни будуть поховані новими комісіями, крім автоматично створених комісій злиття.

  • Якщо ви git pull --rebaseзамість цього, git швидко переправить свого господаря до потоку, а потім застосуйте свої зміни вгорі.


Я зробив це на правильній гілці, але я все ще бачу відмінності між моїми локальними файлами та віддаленою головною гілкою оригінального проекту (хоча він говорить, що все актуально!), Можливо, я налаштував проект неправильно? Будь-який спосіб перевірити?
Мартин

1
@Martyn: Відмінності мають бути вашими місцевими змінами. Зробіть ще одну вилку віддаленої гілки та перевірте, чи є у неї правильний вміст файлу.
ZeissS

4
Я знаю, що це стара відповідь, але зауважте, що ви можете скористатися MERGE замість бази даних. Ви не хочете робити ребайн, якщо згодом доведеться об'єднатись з віддаленим репо, у якому вже є деякі ваші зміни.
Доміно

1
Як щодо (якщо припустити, що ви зараз у відділенні configUpdate) ... git pull в основному те саме, що і git fetch; git merge origin / master. <- НЕ ІСТИНА
Кріс

@Chris: У якому сенсі це неправда? Припущення про походження / господаря як висхідного течії? Або змінилося тягнення git?
Джої Адамс

81

Я дізнався, що це:

$ git fetch upstream
$ git merge upstream/master

6
Отже, якщо ви цього ще не зрозуміли, у вас нічого не вийшло, pull --rebaseоскільки originвказували на вашу вилку. Це спрацювало б, якби ти git pull --rebase upstream/master.
Карл Білефельдт

3
Спробуйте: git merge origin / master
Кріс

Мені не вистачало уваги, ця відповідь вирішила це для мене.
Нуреттін

38

Перейдіть до місцевого відділення

> git checkout configUpdate

Приєднайте віддаленого майстра до своєї філії

> git rebase master configUpdate

Якщо у вас виникли конфлікти, виправте їх і для кожного конфліктуючого файлу виконайте команду

> git add [path_to_file / конфліктований_файл] (наприклад, git add app / properties / javascripts / test.js)

Продовжити базу даних

> git rebase - продовжувати


не бійтеся використовувати rebase замість merge, витрачайте деякий час на розслідування різниці, якщо відчуваєте розрив у цих питаннях
Сергій Селецький

13

git rebase, схоже, не працює на мене. Після відновлення бази даних git, коли я намагаюся натиснути зміни на свою локальну гілку, я постійно отримував помилку ("підказка: оновлення було відхилено, оскільки кінчик вашої поточної гілки знаходиться за її віддаленим аналогом. Інтегруйте віддалені зміни (наприклад," git pull). .. ') перед натисканням знову. ") навіть після витягування git. Що нарешті для мене спрацювало, це git merge.

git checkout <local_branch>
git merge <master> 

Якщо ви такий початківець, як я, ось хороша стаття про git merge vs git rebase. https://www.atlassian.com/git/tutorials/merging-vs-rebasing

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