В объединении 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 с транком, а затем при попытке объединить что-то из под-ветви A в под-ветку B. Кажется, что SVN считает, что ревизия «синхронизация из транка» должна быть законно объединена с под-веткой B и это приводит к массе конфликтов.
- Насколько это возможно, слить из корня ветки. В противном случае, SVN будет держать только след в слияниях сделано для подпапки и когда вы делаете попытку к автоустановкам от корня, вы можете получить предупреждения об отсутствии неслитых изменений. Это можно исправить, просто объединив их из корня, но лучше всего избежать путаницы.
- Будьте осторожны, какую ветку вы делаете. Если вы используете Switch, чтобы ваша рабочая копия со временем указывала на различные ветви, убедитесь, что вы делаете это.
- Это особенно плохо, если вы действительно не хотели изменений в этой ветке. Мне все еще неясно, но в зависимости от того, как вы избавитесь от этого / перенесете его в нужную ветвь (возврат, слияние), вы можете получить что-то грязное. Это исправимо, но вам придется либо объединить редакцию за редакцией, чтобы избежать или немедленно разрешить потенциальные конфликты, либо вам придется исправить, возможно, более сложный конфликт после автоматического объединения.
- Не держите ветки нетронутыми слишком долго. На самом деле, дело не в времени, а в том, сколько ревизий было внесено в ветку и транк и насколько они изменились. Слияния между двумя ветвями, трехсторонние слияния всегда сравниваются с последними общими ревизиями между ветвями Чем больше промежуточных изменений, тем больше изменений не произойдет при автоматическом объединении. Это, конечно, намного хуже, если вы тем временем изменили структуру своего кода (перемещенные или переименованные файлы).
Если вы не будете следовать вышеизложенному, у вас вполне могут возникнуть конфликты. Они всегда решаемы, но не слишком весело проводить время.
О, еще одна вещь о слиянии, где, из всего, что я прочитал и попробовал, SVN действительно отстой: удаленные / перемещенные / переименованные файлы / папки. Очевидно , что SVN все еще не может иметь дело с файлом, который переименовывается, удаляется или перемещается в одной ветви, а его исходная версия изменяется в другой ветви ... и затем объединяется вместе. Он просто не будет знать, куда файл попал одним способом, и «забудет» об изменениях другим способом. Одно изменение явно неразрешимо (вы либо удаляете, либо изменяете файл, но не можете выполнять оба действия), но применение изменений к перемещенным / переименованным файлам должно работать, а это не так. Надеюсь, это скоро исправят.
В общем, легко ли объединить SVN? Я думаю, нет. Конечно, не беззаботно. Это плохо ? Я так не думаю. Он плюет вам в лицо только тогда, когда вы используете его неправильно и не думаете о том, что вы делаете.
Основываясь на этом, я понимаю, почему люди могут предпочесть Mercurial (например), поскольку он немного более снисходительно относится к этим вещам из моего опыта и автоматизировал все с самого начала (по крайней мере, в ранних версиях, с которых я начинал). SVN, тем не менее, догнал немного, так что больше не стоит так сильно ругаться.