GIT злиття майстра у відділення


49

Я розробляв нову функцію на новій гілці, і зі сторони вніс досить багато змін у своїй головній галузі.

Чи можливо об'єднати головну гілку в мою нову гілку, щоб вона була актуальною, щоб у мене не було занадто багато конфліктів злиття, коли нова функція буде закінчена?


Ви пробували git-merge? Довідка тут .
karatedog

Відповіді:


56

Ви можете або, git merge masterабо git rebase masterв цьому випадку я вважаю за краще git rebase .

Оскільки git rebaseце робить так, ніби зміни в гілці функцій були внесені поверх змін на головній гілці, що робить графік версії простішим.

База даних

Візьмемо приклад із посібника з git rebase , git rebase masterу галузі feature:

      A---B---C feature                             A'--B'--C' feature
     /                   --rebase-->               /
D---E---F---G master                  D---E---F---G master

Однак git rebaseвін підходить лише тоді, коли гілка не була розповсюджена, або відбудеться плутанина та додаткова робота вниз за течією, оскільки старі коміти A, B, C замінюються на нові коміти A ', B', C ', плюс F і G, яких раніше не було.

Фактичний результат після git rebase masterв галузі feature:

      ( A---B---C )
       /
      /       A'--B'--C' feature
     /       /
D---E---F---G master

Команди A, B, C звисають після відновлення бази, але вони доступні через git reflog feature.

Злиття

Якщо хтось потягнув вашу гілку, або ви її кудись підштовхнули, вам слід замість неї злитися, щоб уникнути плутанини та зайвої роботи на іншому кінці. Див. Розділ Відновлення з попередньої бази даних .

Це результат git merge masterгалузі feature:

      A---B---C feature                    A---B---C---M feature
     /                   --merge-->       /       ,---’
D---E---F---G master                 D---E---F---G master

Як варіант, якби ви git merge featureпрацювали у філії master, це виглядатиме так:

      A---B---C feature                    A---B---C feature
     /                   --merge-->       /         \
D---E---F---G master                 D---E---F---G---M master

Вам слід пояснити, чому ви віддаєте перевагу ребауз і в чому різниця. Rebase створює лінійну історію - це може не відповідати цьому питанню.
Андреас Рем

Гаразд, якщо я це добре розумію: я повинен перевірити головну гілку, якщо нова функція ще не закінчена, і ребазувати, якщо вона закінчена?
mnml

Ні, якщо гілку функції перевірено, зробіть git rebase master, і вона "перезавантажить" зміни в гілці функцій, щоб вони "базувались" на змінах у головній гілці. Якщо зміни в головній гілці суперечать змінам гілки функцій, git попросить вас їх вирішити та продовжити, пропустити їх або перервати. Якщо ви не впевнені, ви можете перевірити тестову гілку, щоб спробувати її git checkout -b test-feature feature(припустимо, що її галузь має назву "функція").
Крістофер Хаммарстрем

2
Що ви маєте на увазі "більше не бачу моєї гілки"? У будь-якому випадку, його git rebaseслід використовувати лише в тому випадку, якщо гілка не була розповсюджена, що я вважав, що це було так, оскільки ви сказали, що це нова гілка, вибачте за це. Див. Розділ Відновлення з попередньої бази даних у документах, до яких я пов’язаний. Вам доведеться використовувати git mergeзамість цього. І ви можете використовувати, git reflogщоб знайти попередню голову відділення функції, якщо ви хочете отримати її назад.
Крістофер Хаммарстрем

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