І те, rebase
і те, cherry-pick
і merge
мають свої переваги та недоліки. Я заперечую merge
тут, але варто розуміти і те, і інше. (Подивіться тут на альтернативну, добре аргументовану відповідь, що перераховує випадки, де rebase
бажано.)
merge
краще cherry-pick
і rebase
з кількох причин.
- Міцність . Ідентифікатор SHA1 комітету ідентифікує його не тільки сам по собі, але і стосовно всіх інших комітетів, які йому передують. Це дає вам гарантію того, що стан сховища в заданому SHA1 однаковий для всіх клонів. Теоретично немає жодного шансу, щоб хтось зробив те, що схоже на ту саму зміну, але насправді псує або викрадає ваше сховище. Ви можете вибирати вишні в окремих змінах, і вони, ймовірно, однакові, але у вас немає гарантій. (Що стосується другорядного другого питання, то нові вишневі комітети займуть додаткове місце, якщо хтось ще вибирає вишню в тому ж самому фіксації, оскільки вони будуть присутні в історії, навіть якщо ваші робочі копії виявляться однаковими.)
- Простота використання . Люди схильні розуміти
merge
робочий процес досить легко. rebase
, як правило, вважається більш розвиненим. Краще розуміти і те, і інше, але людям, які не хочуть бути експертами в контролі версій (що, на мій досвід, було багато колег, які чортово добре займаються тим, що роблять, але не хочуть витрачати зайвий час) легше час просто зливається.
Навіть із робочим процесом, який є важким для злиття, rebase
і cherry-pick
все ще корисний для конкретних випадків:
- Одним із недоліків
merge
є захаращена історія. rebase
не дозволяє розповсюджувати довгу серію комітетів у вашій історії, як це було б, якби ви періодично зливалися в інших змінах. Це насправді його головне призначення, яким я користуюсь. Що ви хочете бути дуже обережними, це ніколи не rebase
кодувати, якими ви поділилися з іншими сховищами. Після push
редагування комітету хтось інший, можливо, здійснив поверх нього, а повторне звільнення в кращому випадку спричинить тип дублювання, про який говорилося вище. У гіршому випадку, ви можете зіткнутися з дуже заплутаним сховищем та тонкими помилками, для того, щоб провести викид, вам знадобиться багато часу.
cherry-pick
корисно для вибору невеликого набору змін із гілки теми, які ви в основному вирішили відмовитись, але зрозуміли, що є кілька корисних фрагментів.
Що стосується переваги об’єднання багатьох змін у одну: це просто набагато простіше. Ви можете зробити дуже нудним робити злиття окремих наборів змін, як тільки ви почнете мати їх багато. Дозвіл злиття в git (і в Mercurial, і в Bazaar) дуже хороший. Ви не зіткнетесь із великими проблемами, з’єднуючи навіть довгі гілки більшу частину часу. Я, як правило, зливаю все все одночасно, і лише якщо у мене виникає велика кількість конфліктів, я створю резервну копію та повторюю частину злиття. Вже тоді я роблю це великими шматками. Як справжній приклад, у мене був колега, який змінив три місяці, і він отримав 9000 конфліктів у 250000 лінійній кодовій базі. Що ми зробили, щоб виправити, - це зробити об'єднання вартістю одного місяця за один раз: конфлікти не виникають лінійно, і це робиться по шматочках призводить далекоменше 9000 конфліктів. Роботи було ще багато, але не стільки, скільки намагатися зробити це один раз за один раз.