У злитті SVN немає нічого надто складного ... більше ... якщо слідувати правильній філософії
Те, що я бачу в більшості інших відповідей, схоже, походить від людей, які не використовували SVN протягом певного часу. Як хтось точно зазначає: "це було не зафіксовано досить рано, щоб розвіяти міф".
З мого теперішнього досвіду використання SVN 1.6 до 1.8 в спадковому проекті, який я отримав недавно, SVN пройшов довгий шлях до того, щоб зробити об'єднання набагато простішим. Однак це не дурно, і я думаю, що користувачі не можуть легко зазнати відхилень від призначеного використання.
Хоча я досить добре знав SVN, а тим часом пробував Mercurial для особистих проектів, тим часом я ніколи не робив багато розгалужень у SVN перед цим проектом. Було досить багато спроб і помилок, і у мене виникло багато несподіваних конфліктів злиття, коли я починав.
Зрештою, я зрозумів, що кожен раз, коли я отримував одну (або якусь іншу проблему), це було тому, що я не робив все належним чином (він же "SVN шлях" - можливо, належний спосіб управління версіями). Я вважаю, що тут лежить складність: ви не можете робити все, що завгодно, неорганізовано, і очікуєте, що SVN працюватиме ідеально, особливо з об'єднаннями. Злиття вимагають жорсткої дисципліни від користувачів, перш ніж вони покажуть свою справжню силу.
Ось речі, які я помітив, - це настійні рекомендації, якщо не вимоги, щодо чистого використання злиття:
- Використовуйте останню версію SVN (на мою думку 1.6 і вище). Все більше і більше автоматизації та перевірок робиться для вас.
- Використовуйте структуру "стовбур, гілки, теги" за замовчуванням і застосуйте її філософію (не зобов'язуйтесь до тегів). SVN нічого для вас не перевірить. Якщо ви використовуєте тег як гілку (саме такий стан я знайшов у сховищі проектів), він все ще може працювати, але вам потрібно бути послідовним.
- Знайте, що таке гілки та коли їх створити. Те саме з тегами.
- Слідкуйте за тим, щоб бічні гілки були в курсі останніх гілок (зазвичай стовбур, але ви можете гілками з будь-якої гілки технічно). Це обов'язково, якщо ви хочете, щоб SVN робив автоматичні злиття. SVN 1.8 насправді перешкоджає автоматичному злиттю, якщо речі не оновлюються, а також якщо ви маєте зміни в робочій копії (ця поведінка, схоже, знову зникла в 1.8.5).
- Робіть "належні" вчинки. Вони повинні містити лише модифікації щодо дуже конкретної концепції. Наскільки це можливо, вони повинні містити невелику кількість змін. Ви не хочете, щоб одна комісія містила зміни, наприклад, про дві незалежні помилки. Якщо ви вже виправили обидва, і вони знаходяться в одному файлі, вам слід зберегти зміни однієї помилки, щоб ви могли здійснити лише зміни другого першого, а потім здійснити другий набір змін. Зверніть увагу, що TortoiseSVN дозволяє це легко через "Відновити після фіксації".
- Це дає можливість повернути певний незалежний набір змін І дає змогу лише об'єднати такий набір в іншу гілку. Так, SVN дозволяє об'єднати вишневі версії.
- Якщо ви коли-небудь використовуєте підгалузі (відгалужуючи стовбур, то відгалужуючи цю нову гілку), дотримуйтесь ієрархію. Якщо ви оновлюєте підгалузь із стовбуром або навпаки, ви відчуваєте біль. Злиття повинні бути каскадно вниз або вгору за ієрархією.
- Після кількох місяців експериментів я можу поручитися, що це може бути найважливіша частина. Спробували створити дві підгалузі з одного стовбура, а потім об'єднати біти між підгалузями або іноді між підгалузями з будь-якої сторони. Це може вимкнути SVN (або користувача). Це може спрацювати нормально, якщо ви об'єднуєте конкретні зміни. Автоматичне злиття може мати проблеми з цим.
- У мене виникли проблеми, зокрема, коли синхронізували підгалузь A з магістраллю, а потім намагалися об'єднати щось із підрозділу А в підгалузь B. SVN, здається, вважає, що перегляд "синхронізувати з магістралі" слід законно об'єднати в підгалузь. Б і це призводить до маси конфліктів.
- Максимально зливайтеся з кореня гілки. В іншому випадку, SVN буде тримати тільки слід в злиттях зроблено для папки і коли ви робите спробу до Автоустановка від кореня, ви можете отримати попередження про відсутність неслітих змін. Це можна виправити, просто об'єднавши їх із коренем, але найкраще уникати плутанини.
- Будьте уважні, в якій галузі ви берете на себе зобов’язання. Якщо ви використовуєте Switch, щоб через час ваша робоча копія вказувала на різні відділення, будьте впевнені, куди ви збираєтеся.
- Особливо погано, якщо ви дійсно не хотіли змін у цій галузі. Мені все ще незрозуміло, але залежно від того, як ви його позбудетесь / перенесите у потрібну гілку (повернення, злиття), ви можете отримати щось безладне. Це можна виправити, але вам доведеться або злити ревізію шляхом перегляду, щоб уникнути або негайно вирішити потенційні конфлікти, або вам доведеться виправити можливий складніший конфлікт після автоматичного злиття.
- Не тримайте гілки недоторканими занадто довго. Насправді справа не в часі, а в тому, скільки ревізій було здійснено для гілки та стовбура та скільки змінилося в них. Злиття між двома гілками, тристоронні злиття, завжди порівнюються з останніми загальними переглядами між гілками. Чим більше змін між ними, тим більше змін буде автоматичним злиттям. Це, звичайно, набагато гірше, якщо ви тим часом змінили структуру свого коду (перемістили або перейменували файли).
Якщо ви не будете слідувати вищесказаному, у вас є велика ймовірність виникнення конфліктів. Вони завжди вирішувані, але не дуже цікаво проводити час.
О, ще одна річ, що стосується об'єднання, де з усього, що я читав і намагався, SVN справді смокче: видалені / переміщені / перейменовані файли / папки. Мабуть , SVN все ще не може мати справу з перейменованим, видаленим або переміщеним файлом в одній гілці, а його оригінальну версію змінено в іншій гілці ... і потім об'єднати їх разом. Він просто не знатиме, куди пішов файл в один бік, і "забуде" зміни в інший бік. Одне зміна, очевидно, нерозв’язане (ви видаляєте або змінюєте файл, не можете зробити і те й інше), але застосування змін до переміщених / перейменованих файлів має працювати, і це не відбувається. Сподіваємось, це скоро виправиться.
Отже, загалом, чи легко злиття SVN? Я думаю, що не. Напевно, не безтурботно. Це погано ? Я не думаю, що так. Він плюватиме вам в обличчя лише тоді, коли ви використовуєте його неправильно і не думаєте достатньо про те, що робите.
Виходячи з цього, я можу зрозуміти, чому люди можуть віддавати перевагу Mercurial (наприклад), оскільки з мого досвіду це трохи поблажливіше, і все було автоматизовано з початку роботи (принаймні, з ранніх версій, з яких я починав). SVN, однак, наздогнав зовсім небагато, тому більше не вартий такого великого удару.