2010-07-05 3 views
30

Я нахожу этот способ проще слиться ветви и меньше конфликтов:Subversion rebase?

Copy хобот в новую ветку, объединить его с функцией филиала/с. Когда все будет сделано, слейте новую ветку обратно в багажник. Этот метод похож на меркурийный и git-rebasing.

Я использовал для слияния все, что меняется от сундука до функции branche/s. Но позже, когда я объединил ветку функций обратно в багажник, часть материала из багажника снова будет объединена с багажником, что вызвало множество конфликтов. Есть выбор реинтеграции слияния, но он, похоже, не работает для меня.

Есть ли у кого-нибудь подобный подрывной перегиб? Я только начал делать это недавно и не видел никаких побочных эффектов. Может ли это вызвать какие-либо непредвиденные проблемы?

+0

Я vcs noob. Мне любопытно: что это за конфликты? Если вы объедините trunk @ r1 через trunk @ r2 в ветвь и объедините результат обратно в trunk, тогда не должно быть никаких изменений из-за магистрали. Можете ли вы привести пример? –

+0

Что вы предлагаете в своем вопросе - это правильное решение ;-) Он должен работать так, как ожидалось, я не вижу никаких побочных эффектов. – ymajoros

ответ

0

Я использую этот подход:

С перебазирования вы должны заботиться, чтобы не принимать нормированный пересмотров более, когда вы объединяете снова. Когда дело доходит до слияния, сделайте выбор вишни: выберите только изменения в ветви функции, которые реализуют что-то новое, а не переустанавливающие изменения. Тогда он должен работать нормально. КОММЕНТАРИЙ: Я никогда не мог вспомнить, что я использовал реинтеграцию для чего-то. Я думаю, что он предназначен только для очень простых случаев использования.

В вашем новом подходе из описания, как вам следует обращаться с переустановкой из магистрали в свои ветви функций, неясно, если вам нужно. Вы хотите полностью запретить перезагрузку? Поскольку ветвление в svn является дешевой операцией, это может быть и вариант.

+1

Ниже приводится моя процедура: 1. багажник-> f1, f2 (ветви функций) 2. когда f1, f2 сделано, магистраль-> версия ветви (для интеграции) 3. объединить f1, f2 в ветвь версии (VB) 4. тест VB; слияние исправлений от f1, f2 до VB; держите этот шаг коротким, в противном случае повторите 2 - 3 5. когда VB сделайте, объедините его обратно в багажник, отпустите его. –

7

Хотелось бы, чтобы у меня был умный трюк, чтобы рассказать вам о том, как добиться перезагрузки в SVN, но я всегда избегал ручного обновления ветви с изменениями ствола в SVN в основном из-за осложнений, требующих ручной сортировки вишни, о которых упоминает jdehaan.

То, что я обычно делаю вместо этого, следует практике слияния изменений от ветви к стволу, удаляя ветку, а затем воссоздавая ветку из ствола. Это позволяет мне обновить/переустановить мою ветку функций, но с иногда неудачным побочным эффектом, что любые предыдущие изменения из этой ветви теперь являются частью туловища. По этой причине я только следую этой практике, когда ветка признаков находится в стабильном и пригодном для использования месте, но я все же хочу продолжить работу над этой функцией, чтобы еще больше выполнить более крупную задачу.

Что бы я предпочел, то, что обновление ветви путем слияния ствола обратно в ветку не вызывает последующую реинтеграцию, сливается с этой веткой, чтобы вытащить эти измененные изменения во время процесса. Это должно быть возможно на основе свойств слияния-info, но в соответствии с тем, что говорит jdehaan, и я опасаюсь, что для этого все еще требуется выбор вишни.

Обратите внимание, что правильная реализация буксировки также должна учитывать примеры лестничных клеток, где ветка выполнена из другой ветви.

Update: Согласно документации Subversion это кажется, что при использовании --reintegrate option, что Subversion должен быть в состоянии должным образом реинтеграции работы в отрасли таким образом, чтобы умы любых возможных слияний обновления экрана, что может быть сделаны, чтобы привести базу переходит в ветвь. Конечно, это технически немного отличается от перезагрузки, но я думаю, что он достаточно похож на использование, что его можно назвать перезагрузкой.

+1

Вы должны использовать * - реинтегрировать * при слиянии вверх по течению в подрывной деятельности. Все это происходило с отслеживанием слияния w/svn 1.5 и позволило слить * возможный * по сравнению со старыми головными болями отслеживания, какие изменения были объединены в ветку. Это по-прежнему довольно примитивная реализация по сравнению с тем, что предлагает hg/git, и не очень-то разделить процесс перезагрузки. Это больше, когда вы закончили работу с ветвью функций или выпусков. – quickshiftin

4

В моей компании мы используем следующий подход:

  1. для каждой задачи $ X НК-в системе отслеживания проблем, у нас есть отдельные ветви ветви/$ X НК-
  2. мы начинаем работу над задачей по svn cp trunk branches/NK- $ X
  3. Мы никогда не совершаем изменения непосредственно в багажнике. Для каждого запланированного обновления UPDNK- $ X мы имеем отдельные ветви/UPDNK- $ X. Мы создаем его с svn cp trunk branch/UPDNK- $ X перед обновлением.
  4. когда задача NK- $ X запланирована для обновления UPDNK- $ Y, мы объединяем ветки/NK- $ X inot UPDNK- $ Y. Это cd UPDNK- $ Y; svn merge -r start: HEAD ветви/NK- $ X
  5. после UPDNK- $ Y готов, мы сливаем его в багажник. То есть магистральный кд; SVN слияния -r старт: ГОЛОВА ветви/UPDNK- $ Y

Если это произойдет, что задача $ X НК-длится дольше, чем один итерации цикла, и, следовательно, нуждается в освежающий, мы никогда, никогда, НИКОГДА не соединяйте ствол с NK-X. У нас есть правило, которое вы передаете своей ветке только тем, что вы написали сами, что делает все проще. Вместо этого мы делаем:

cd NK-$X 
svn log 
//let L = the number of the last changeset to this branch changeset 
//let F = the number of the first changeset to this branch 
svn rm branches/NK-$X 
svn cp trunk branches/NK-$X 
svn up 
svn merge -r F:L branches/[email protected] 
svn ci -m 'refereshed' 

Таким образом, всякий раз, когда вы посмотрите на список изменений филиалов/$ X НК-вы видите только изменения фактически выполненный разработчик.

Update: Поскольку последовательность действия могут быть автоматизированы, я начал проект по GitHub: svn rebase.

17

Вообще говоря, перезагрузка является актом включения восходящих изменений в ветвь признаков, прежде чем объединить ветвь функции обратно в ветвь вверх по течению.

В git процесс еще более сложный, поскольку изменения, которые были сделаны после создания ветви, сначала снимаются и буферизуются, применяются изменения восходящего потока, затем применяются буферизованные изменения. Вынос здесь заключается в слиянии ствола с филиалом функции, а не с перестановкой в ​​git-терминах. Подход git имеет ряд преимуществ, но не может быть реализован очень четко в svn, поскольку все коммиты должны храниться на сервере (svn не распространяется), однако может быть выполнен в svn.

An 'СВН перебазироваться' (мерзавец путь) может выглядеть примерно так

  1. svn cp trunk feature
  2. совершающее с функцией & Магистральные
  3. svn cp trunk feature-rebase
  4. svn co feature-rebase
  5. cd feature-rebase
  6. svn merge feature
  7. svn commit
  8. svn rm feature
  9. svn mv feature-rebase feature
  10. (обратно на функцию-Rebase WC) svn switch feature

Тогда в конечном итоге на рабочую копию ствола, svn merge --reintegrate feature

Вы видите отличие от просто слияние магистрали с ветвью функций? В этом примере вы начинаете с последнего из восходящего потока, туловища, а затем объединяете изменения с этой функции.

Представьте, что некоторые из коммитов на багажнике могут произойти из-за слияния другой ветви функции в багажник, поэтому я вовсе не сторонник совершения прямого удара по стволу.

+3

Я немного подталкиваю ноги, но решил поставить [статью] (http://quickshiftin.com/blog/2013/09/svn-rebase-git-way/) по теме, дающей тщательный описание. – quickshiftin

Смежные вопросы