Когда ветка снова присоединяется к стволу, действительно ли эта ветка мертва?
Можете ли вы внести изменения в ветку после реинтеграции и объединить их обратно в магистраль позже?
Когда ветка снова присоединяется к стволу, действительно ли эта ветка мертва?
Можете ли вы внести изменения в ветку после реинтеграции и объединить их обратно в магистраль позже?
Вы можете сделать это технически, ваша ветка не мертва и не отключена, но не рекомендуется выполнять слияние из ветки в магистраль после реинтеграции.
Вы можете найти полное обсуждение причины этого здесь: Повторная интеграция слияния Subversion а>
По сути, в нем говорится, что можно снова объединить ваши изменения в ствол, но поскольку реинтеграция заставляет вас выполнять слияние из ствола в ветку до операции реинтеграции, вы столкнетесь с отражающим / циклическим слиянием, что очень проблематично в Subversion 1.5. .
Согласно статье, рекомендуется удалить реинтегрированную ветку сразу после реинтеграции и вместо нее создать новую с тем же (или другим) именем.
Это известное поведение Subversion, которое будет исправлено в будущей версии (возможно, в 1.6).
Фактически, вам нужно сделать --record-only
слияние из ствола в вашу ветку ревизии, созданной --reintegrate
фиксацией:
$ cd trunk
$ svn merge --reintegrate ^my-branch
$ svn commit
Committed revision 555.
# This revision is ^^^^ important
И теперь вы записываете это
$ cd my-branch
$ svn merge --record-only -c 555 ^trunk
$ svn commit
Вы счастливы держать ветку сейчас
Дополнительная информация находится в Глава 4. Ветвление и слияние, расширенное слияние.
После реинтеграции из ветки в ствол вы должны сделать одно из двух:
Удалите свою ветку . Это самый простой способ, но из-за него сложнее увидеть историю ветки.
Скажите своей ветке не объединять реинтегрировать фиксацию. Если вы реинтегрируетесь в ствол и зафиксируете его как ревизию X, вы можете запустить эту команду в своей ветке: svn merge --record-only -c X url-to-trunk
. Однако вам не следует этого делать, если вы внесли какие-либо изменения в рамках фиксации, кроме самого слияния. Любые другие изменения никогда не вернутся в вашу ветку.
Несколько советов по обратному слиянию изменений, если кто-то вносит изменения в ветку несколько раз (до 1.5): Помните, в какой ревизии вы выполняли слияние! Либо запишите где-нибудь номера ревизий, либо либо (что проще) сделайте тег. (Вы, конечно, можете узнать это позже, но это PITA.)
Пример:
У вас есть такой макет репозитория:
/your_project
/trunk
/branches
/tags
Допустим, это веб-приложение, и вы запланировали его выпуск. Вы должны создать тег и из него (или из ствола) ветку, в которой вы исправляете ошибки:
/your_project
/trunk
/branches
/1.0.0-bugfixes
/tags
/1.0.0
Поступая таким образом, вы можете интегрировать новые функции в магистраль. Все исправления ошибок будут происходить только в ветке с исправлениями ошибок, и перед каждым выпуском вы делаете тег для текущей версии (теперь из ветки с исправлениями).
Предположим, вы исправили изрядное количество ошибок и выпустили их на рабочий сервер, и вам отчаянно нужна одна из этих функций в текущей магистрали:
/your_project
/trunk
/branches
/1.0.0-bugfixes
/tags
/1.0.0
/1.0.1
/1.0.2
Теперь вы можете просто интегрировать изменения между 1.0.0 и 1.0.2 в свою магистраль (при условии, что вы находитесь в своей рабочей копии):
svn merge http://rep/your_project/tag/1.0.0 http://rep/your_project/tag/1.0.2 .
Вот о чем следует помнить. Вы уже объединили изменения между 1.0.0 и 1.0.2 в стволе. Предположим, в текущем производственном выпуске есть больше изменений:
/your_project
/trunk
/branches
/1.0.0-bugfixes
/tags
/1.0.0
/1.0.1
/1.0.2
/1.0.3
/1.0.4
Теперь вы готовы выпустить новую версию из транка, но последние изменения ваших исправлений все еще отсутствуют:
svn merge http://rep/your_project/tag/1.0.2 http://rep/your_project/tag/1.0.4 .
Теперь у вас есть все изменения, объединенные в ваш ствол, и вы можете сделать свой выпуск (не забудьте сначала его протестировать).
/your_project
/trunk
/branches
/1.0.0-bugfixes
/1.1.0-bugfixes
/tags
/1.0.0
/1.0.1
/1.0.2
/1.0.3
/1.0.4
/1.1.0
Как все уже здесь сказали: ветка не мертва, и ее выполнение может продолжаться нормально.
Иногда вы хотите убить ветку после слияния. Единственное надежное решение - удалить ветку. Обратной стороной является то, что тогда сложнее снова найти ветку, если вы хотите взглянуть на нее, скажем, по историческим причинам. Таким образом, многие люди оставляют «важные» ветки лежать без дела и соглашаются не менять их. Я хотел бы, чтобы был способ пометить ветку как мертвую / только для чтения, чтобы никто не мог зафиксировать ее до дальнейшего уведомления.
Нет, ветка еще жива, но на тот момент она такая же, как и ствол. Если вы продолжаете развиваться в ветке, вы можете позже повторно объединиться с основной веткой.
Вы можете выполнять слияние из ветки в магистраль или из магистрали в ветку столько раз, сколько захотите.
Прежде всего, вам следует обновить клиент и сервер Subversion, если вы все еще используете Subversion 1.7 или более раннюю версию. Нет причин использовать очень старые выпуски Subversion. По состоянию на 2016 год текущая версия - Subversion 1.9. SVN 1.8 теперь также поддерживается и все еще получает исправления ошибок.
Проблема, о которой вы спрашиваете, была решена в Subversion 1.8. Начиная с SVN 1.8, опция --reintegrate
устарела. Слияние с повторной интеграцией теперь выполняется автоматически. См. Раздел примечания к выпуску Subversion 1.8, связанный с улучшением.
Прочтите SVNBook 1.8 | Повторная интеграция ветки:
Если вы решите не удалять свою ветку после реинтеграции ее в ствол, вы можете продолжить выполнять синхронизирующие слияния из ствола, а затем повторно интегрировать ветвь. Если вы это сделаете, в ствол будут объединены только изменения, сделанные в вашей ветке после первой реинтеграции.
...
Только Subversion 1.8 поддерживает такое повторное использование функциональной ветви. Более ранние версии требуют особой обработки, прежде чем функциональная ветвь может быть повторно интегрирована более одного раза. Дополнительную информацию см. В более ранней версии этой главы: http://svnbook.red-bean.com/en/1.7/svn.branchmerge.basicmerging.html#svn.branchemerge.basicmerging.reintegrate
Когда вы выполняете слияние, вы указываете цель. Вы можете объединить различия TreeA и TreeB с TreeC, если хотите. Как предполагает Крис, ваш вопрос не имеет особого смысла. Если вы объедините свою ветку со стволом, ветка останется нетронутой. Если в дальнейшем ветка не понадобится, ее можно удалить.
Вы можете продолжать разработку в ветке, вам понадобится функция слияния-отслеживания, которая находится в Subversion 1.5, это означает, что дополнительные слияния из ветки включают только новые изменения.