Git Cherry-pick vs Merge Workflow


302

Якщо припустити, що я підтримую репо, і я хочу вносити зміни з дописувача, є кілька можливих робочих процесів:

  1. Я cherry-pickкожен здійснюю віддалено (по порядку). У цьому випадку git записує комісію як не пов'язану з віддаленою гілкою.
  2. Я mergeфілію, втягуючи всі зміни і додаючи новий «конфлікт», виконуючи (якщо потрібно).
  3. Я mergeкожний здійснюю з віддаленої гілки окремо (знову в порядку), дозволяючи записати конфлікти для кожного комітету, а не згрупувати всі разом як одне ціле.
  4. Для повноти ви можете зробити так rebaseсамо (як cherry-pickваріант?), Однак я розумію, що це може спричинити плутанину у учасника. Можливо, це виключає варіант 1.

В обох випадках 2 і 3 git записує філіальну історію комітетів, на відміну від 1.

Які плюси та мінуси між використанням cherry-pickабо mergeописаних методів? Я розумію, що метод 2 є нормою, але я вважаю, що вирішення великого комітету за допомогою єдиного "конфліктного" злиття не є найчистішим рішенням.

Відповіді:


296

І те, rebaseі те, cherry-pickі mergeмають свої переваги та недоліки. Я заперечую mergeтут, але варто розуміти і те, і інше. (Подивіться тут на альтернативну, добре аргументовану відповідь, що перераховує випадки, де rebaseбажано.)

mergeкраще cherry-pickі rebaseз кількох причин.

  1. Міцність . Ідентифікатор SHA1 комітету ідентифікує його не тільки сам по собі, але і стосовно всіх інших комітетів, які йому передують. Це дає вам гарантію того, що стан сховища в заданому SHA1 однаковий для всіх клонів. Теоретично немає жодного шансу, щоб хтось зробив те, що схоже на ту саму зміну, але насправді псує або викрадає ваше сховище. Ви можете вибирати вишні в окремих змінах, і вони, ймовірно, однакові, але у вас немає гарантій. (Що стосується другорядного другого питання, то нові вишневі комітети займуть додаткове місце, якщо хтось ще вибирає вишню в тому ж самому фіксації, оскільки вони будуть присутні в історії, навіть якщо ваші робочі копії виявляться однаковими.)
  2. Простота використання . Люди схильні розуміти mergeробочий процес досить легко. rebase, як правило, вважається більш розвиненим. Краще розуміти і те, і інше, але людям, які не хочуть бути експертами в контролі версій (що, на мій досвід, було багато колег, які чортово добре займаються тим, що роблять, але не хочуть витрачати зайвий час) легше час просто зливається.

Навіть із робочим процесом, який є важким для злиття, rebaseі cherry-pickвсе ще корисний для конкретних випадків:

  1. Одним із недоліків mergeє захаращена історія. rebaseне дозволяє розповсюджувати довгу серію комітетів у вашій історії, як це було б, якби ви періодично зливалися в інших змінах. Це насправді його головне призначення, яким я користуюсь. Що ви хочете бути дуже обережними, це ніколи не rebaseкодувати, якими ви поділилися з іншими сховищами. Після pushредагування комітету хтось інший, можливо, здійснив поверх нього, а повторне звільнення в кращому випадку спричинить тип дублювання, про який говорилося вище. У гіршому випадку, ви можете зіткнутися з дуже заплутаним сховищем та тонкими помилками, для того, щоб провести викид, вам знадобиться багато часу.
  2. cherry-pick корисно для вибору невеликого набору змін із гілки теми, які ви в основному вирішили відмовитись, але зрозуміли, що є кілька корисних фрагментів.

Що стосується переваги об’єднання багатьох змін у одну: це просто набагато простіше. Ви можете зробити дуже нудним робити злиття окремих наборів змін, як тільки ви почнете мати їх багато. Дозвіл злиття в git (і в Mercurial, і в Bazaar) дуже хороший. Ви не зіткнетесь із великими проблемами, з’єднуючи навіть довгі гілки більшу частину часу. Я, як правило, зливаю все все одночасно, і лише якщо у мене виникає велика кількість конфліктів, я створю резервну копію та повторюю частину злиття. Вже тоді я роблю це великими шматками. Як справжній приклад, у мене був колега, який змінив три місяці, і він отримав 9000 конфліктів у 250000 лінійній кодовій базі. Що ми зробили, щоб виправити, - це зробити об'єднання вартістю одного місяця за один раз: конфлікти не виникають лінійно, і це робиться по шматочках призводить далекоменше 9000 конфліктів. Роботи було ще багато, але не стільки, скільки намагатися зробити це один раз за один раз.


1
Насправді, теоретично є ймовірність, що Mallory може пошкодити ваше сховище, створивши коміти з тим самим SHA1, але різним вмістом, це, ймовірно, ніколи не трапиться на практиці. :)
Бомбе

1
Ха :) Я мав на увазі, "теоретично шанси настільки низькі, що ви можете розраховувати на те, що це не відбудеться", але ви праві, що в ньому написано топси-трюс.
кварк

Що ви думаєте про "злиття - сквош"?
cmcginty

@Bombe Якщо Маллорі хоче досягти успіху, їй доведеться спеціально створити оригінальний фіксатор та другий комітет з тим же SHA1. Тож може виникнути ще одне питання: які шанси на дві (дещо) фіктивні вчинки з’являються, і ви цього не помічаєте? ;)
Жоао Портела

64
9000 конфліктів? Я би кинув свою роботу і став бджолярем.
Себастьян Паттен

95

На мою думку, збирання вишні повинно бути зарезервоване для рідкісних ситуацій, коли це потрібно, наприклад, якщо ви зробили якусь поправку безпосередньо на "головній" гілці (стовбур, головна гілка розвитку), а потім зрозуміли, що її слід застосовувати також до "Maint" '. Ви повинні базувати робочий процес або на злитті, або на ребазі (або "git pull --rebase").

Будь ласка, пам’ятайте, що вибрана або викладена на вишню комірка відрізняється з точки зору Git (має інший ідентифікатор SHA-1), ніж оригінал, тому вона відрізняється від фіксації у віддаленому сховищі. (Rebase зазвичай може вирішувати це, оскільки він перевіряє ідентифікатор патча, тобто зміни, а не ідентифікатор комісії).

Також в git можна з’єднати відразу багато гілок: так зване злиття восьминога . Зауважте, що злиття восьминога має успіх без конфліктів. Проте це може бути корисним.

HTH.


19
+1 для моменту, що перезавантаження / вишня вибору фактично "копіює" зобов'язання і, таким чином, втрачає зв'язок з оригіналом.
studgeek

1
Ми використовуємо Cherry-pick таким чином, виключно для переміщення комісій для виправлення помилок (можливо, ДУЖЕ МАЛИХ функцій) у існуючу гілку випуску для підготовки виправлення. Особливості, що охоплюють кілька комітетів, зазвичай вимагають переходу у гілку випуску, яка базується на головному.
foxxtrot

3
@foxxtrot: Іншим рішенням є створення окремої гілки для виправлення помилок, заснованого на найдавніших комісіях, які демонструють цю помилку, та об'єднання її у 'maint' та у 'master' ... хоча в цьому випадку вам потрібно знати, що вказана помилка стосується обох галузей.
Якуб Нарбський

4
@Jakub Дві команди, необхідні для створення та об'єднання гілки помилок: git blameзнайти комітку, яка ввела помилку, та git branch --containsвизначити, де об’єднати гілку. Детальніше описано в цій публікації
gcbenison

-10

Rebase та Cherry-pick - це єдиний спосіб зберегти чисту історію фіксації. Уникайте використання злиття і уникайте створення конфлікту злиття. Якщо ви використовуєте герріт, встановіть один проект на Злиття, якщо необхідно, а один проект у вишневому режимі та спробуйте самостійно.


зовсім не зрозуміло, як це відповідає на питання, можливо, деякі приклади принесуть трохи світла.
Адріан Насуї

1
Те, що ваша історія виглядала б прямо, не означає, що це було б легше зрозуміти.
nicolimo86

Об’єднання - це звичайний спосіб мати чисту історію. Вишня та ребаза використовуються здебільшого для ситуацій, коли потрібно змінювати історію. Що означає, що злиття завжди має бути першим вибором. Тому що перезагрузка змінила, що дуже небезпечно при роботі з дистанційними та кількома людьми.
Radon8472

Цей хлопець саме тут заслуговує медалі. Він знає, що продовжуватиме голосувати, але це правильна відповідь. Кудос.
PW Kad

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