Subversion: как объединить только конкретные изменения в тулу, когда в ветке происходят несколько последовательных изменений?
Я использую TortoiseSVN, svn и subclipse, и я думаю, что я понимаю основы, но там одна вещь, которая меня раздражала какое-то время: Слияние вводит нежелательный код. Здесь шаги.
trunk/[email protected]
. Тестовый файл был создан с помощью "A" и возврата:
A
[EOF]
branches/TRY-XX-Foo/[email protected]
. Разветвьте trunk
на TRY-XX-Foo
:
A
[EOF]
branches/TRY-XX-Foo/[email protected]
. Сделал нежелательное изменение в TRY-XX-Foo
и совершил его:
A
B (unwanted change)
[EOF]
branches/TRY-XX-Foo/[email protected]
. Сделал важное исправление ошибки в TRY-XX-Foo
и зафиксировал его:
A
B (unwanted change)
C (important bug fix)
[EOF]
Теперь я хотел бы объединить только важное исправление ошибок в trunk. Итак, я запускаю слияние для ревизии 4:5
. То, что я в конечном итоге в моем рабочем каталоге, является конфликтом.
trunk/test.txt
:
A
<<<<<<< .working
=======
B (unwanted change)
C (important bug fix)
>>>>>>> .merge-right.r5
[EOF]
В отличие от моей воли, Subversion теперь включила "нежелательные изменения" в код соединительной линии, и мне нужно отменить их вручную. Есть ли способ объединить только указанные изменения, когда в ветке сделаны несколько последовательных изменений?
Часть проблемы состоит в том, что B (неосновное изменение) входит в .merge-right, и я не могу сказать разницу между тем, из какой версии он пришел. Обычно я использую TortoiseMerge, и вот как это выглядит.
![text.txt.working]()
Ответы
Ответ 1
Проблема заключается в том, что и svn
A
<<<<<<< .working
=======
B (unwanted change)
C (important bug fix)
>>>>>>> .merge-right.r341
а TortoiseSVN рассматривает ситуацию как двухстороннее слияние. Я слышал о термине 3-way merge, поэтому я дал Beyond Compare выстрел. С помощью быстрой настройки с TortoiseSVN, Edit Conflict теперь откроет следующий экран. Это не идеально, так как оно все еще требует вмешательства человека, но, по крайней мере, я могу определить, какие изменения происходят отсюда.
Смотрите снимок экрана.
Ответ 2
Слияние только ревизий 4,7 и 11-15 с svnmerge:
svnmerge.py merge -r4,7,11-15
И с регулярным svn:
svn merge -c4,7 -r10:15 http://.../branches/TRY-XX-Foo
Ответ 3
Я считаю, что вы включили исправления, которые хотите правильно, но алгоритм слияния не находит место для вставки желаемого изменения и, таким образом, включая строку над ним. Вот те же шаги, но с другим набором изменений, и я считаю, что он работает так, как вы ожидали первоначально:
$ svnadmin create repo
$ svn mkdir -m '' file://`pwd`/repo/trunk
Committed revision 1.
$ svn mkdir -m '' file://`pwd`/repo/branches
Committed revision 2.
$ svn co file://`pwd`/repo/trunk co.trunk
Checked out revision 2.
$ cat > co.trunk/test.txt << EOF
> A
> B
> C
> EOF
$ svn add co.trunk/test.txt
A co.trunk/test.txt
$ svn commit -m '' co.trunk
Adding co.trunk/test.txt
Transmitting file data .
Committed revision 3.
$ svn copy -m '' file://`pwd`/repo/trunk file://`pwd`/repo/branches/testbr
Committed revision 4.
$ svn co file://`pwd`/repo/branches/testbr co.testbr
A co.testbr/test.txt
Checked out revision 4.
$ cat > co.testbr/test.txt << EOF
> A
> A1 unwanted
> B
> C
> EOF
$ svn commit -m '' co.testbr
Sending co.testbr/test.txt
Transmitting file data .
Committed revision 5.
$ cat > co.testbr/test.txt << EOF
> A
> A1 unwanted
> B
> B1 wanted
> C
> EOF
$ svn commit -m '' co.testbr
Sending co.testbr/test.txt
Transmitting file data .
Committed revision 6.
$ svn merge -r 5:6 file://`pwd`/repo/branches/testbr co.trunk
--- Merging r6 into 'co.trunk':
U co.trunk/test.txt
$ cat co.trunk/test.txt
A
B
B1 wanted
C
Ответ 4
Хорошо, чтобы прояснить вопрос о слиянии, состоит в том, что на самом деле он имеет 2 шага.
Таким образом, это означает, что после завершения слияния вы можете выполнить ручную разницу с головкой и другой ветвью, чтобы убедиться, что слияние было правильным.
И если с этим что-то не так, как в вашем случае,
вы можете вручную исправить его до фиксации.
/Johan
Ответ 5
В TortoiseSVN вы должны указать только те версии, которые хотите объединить. В отличие от клиента командной строки, где вы должны указать, например. -r4: 5, чтобы объединить изменения между r4 и r5, вам нужно указать только "5" в качестве номера версии, чтобы объединиться в диалоговом окне слияния TortoiseSVN. Если вы не уверены, всегда используйте диалог журнала из диалогового окна слияния и выберите изменения, которые вы хотите объединить в этом диалоговом окне журнала (затем нажмите "ОК", и выбранные изменения будут автоматически установлены в диалоговом окне слияния).
Что касается разрешения конфликта в TortoiseMerge:
Согласно скриншоту в вашем вопросе, TortoiseMerge показывает вам две конфликтующие строки (те, что показаны как "????" в нижнем виде).
Вы хотите включить изменение "C", но не "B"?
- щелкните левой кнопкой мыши по первому '???' line, чтобы выбрать его, затем щелкните правой кнопкой мыши, выберите "использовать блок из" mine "из контекстного меню
- щелкните левой кнопкой мыши по второму '???' чтобы выбрать его, затем щелкните правой кнопкой мыши, выберите "использовать блок из" своего "из контекстного меню
- Нажмите кнопку сохранения (или Файл- > Сохранить)
- При желании нажмите кнопку "Отметить как разрешенную"
Ответ 6
Еще одна вещь, которую вы могли бы сделать, - это вручную отменить неудачную фиксацию на ветке, которая затем позволит вам объединить ветку обратно в туловище, как обычно.
TortoiseSVN
Используя TortoiseSVN, вы открываете просмотр журнала в файле, выбираете оскорбительную версию и выбираете "Отменить изменения из этой ревизии" в меню правой кнопки мыши. Зафиксируйте изменения, которые он делает на вашей рабочей копии, и вы можете легко слить ветку.
Командная строка
Чтобы сделать это с клиентом командной строки, вы выполняете обратное слияние (это взято из Прагматического источника управления с помощью книги Subversion), где вы объединяете изменения между оскорбительной версией и предыдущей версией в рабочую копию файла, Затем, как и выше, вы совершаете изменения и затем можете нормально работать. В вашем примере вы бы сделали что-то вроде:
svn merge -r 4:3 test.txt
Ответ 7
Как отмечают другие пользователи (я не буду признавать это, потому что я этого не сделал), это может быть тривиальный характер этого слияния (т.е. отсутствие контекста вокруг изменения), который путает инструменты.
Я делаю много слияния, и, как вы обнаружили, инструмент слияния, предоставляемый Tortoise, ужасен. Инструмент трехстороннего слияния является абсолютным обязательным, если вы делаете это очень часто. Beyond Compare - мой личный фаворит, но есть и другие, которые являются бесплатными (Meld, KDiff3) и те, которые не являются (Araxis).
Вы заметите, что Beyond Compare выполнил правильные действия в конце, даже если это заставляет вас вручную проверить правильность!
Ответ 8
Если вы не хотите нежелательных изменений, не объединять ревизию 4: 5, а просто пересмотреть 5. Это означает, что вы объедините изменение, совершенное в версии 5.