Подтвердить что ты не робот

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

4b9b3361

Ответ 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.