Каковы преимущества Mercurial или git по svn для ветвления/слияния?

Я слышал, например, что слияние ветвей с git или mercurial проще, чем с svn.

Чтение последнего Джоэля на блоге в блоге программного обеспечения, я не понял его, почему именно. Не могли бы вы привести конкретный пример , где слияние с git/mercurial приведет к меньшему объему конфликтов по сравнению с svn?

Ответ 1

Один простой пример: git может автоматически конвертировать слияние в "быструю перемотку вперед". Например, допустим, у меня есть ветка, которая выглядит так:

Учитель:

A ---> B ---> C

И я создаю ветвь функции на основе Мастера с новыми коммитами D и E.

Характеристика:

A --- > B ---> C
                \
                 D ---> E

В svn, когда вы объединяете ветвь функции обратно в master, вы должны создать совершенно новую фиксацию, которая применяет изменения D и E на Master. Итак, это выглядит так:

Master:
    A ---> B ---> C -----------------> F
Feature:           \                  /
                    ---> D ---> E -->

В git у нас есть выбор, как включить функцию ветвления в master. Если мы сделаем

git rebase feature

git автоматически распознает, что это тривиальное слияние и выполнить ускоренное слияние, которое добавит новые коммиты к главной ветки. Результатом перезагрузки является:

Учитель:

A ---> B ---> C ---> D ---> E

Обе главы Master и Feature point при фиксации E (другими словами, они выглядят точно так же). Слишком быстрое слияние похоже на то, что происходит, когда вы выполняете обновление в svn.

Кроме того, у вас есть возможность форсировать git, чтобы создать фиксацию слияния. Если вместо этого мы делаем:

git merge feature

git создаст слияние. Результатом слияния является:

Master:
    A ---> B ---> C -----------------> F
Feature:           \                  /
                    ---> D ---> E -->

Commit F - комбинация D и E.

Ответ 2

Отметьте HGINIT вне. Это статья/учебник Джоэл Спольски (не его последняя запись в блоге) по этой теме. Вы можете найти особенно интересную Subversion Re-Education.

Ответ 3

Subversion удобно реализует только единую концепцию - ветки страха. Это означает, что одна ветвь всегда равна parent, а другая - feature. Функция может вытаскивать обновления из родителя с течением времени (слияние), но родитель может отключать изменения функций только один раз (merge -reintegrate), а затем ребенок должен быть закрыт. Это достаточно во многих случаях, но не всегда. Не все ветки - это ветки признаков. У меня есть несколько примеров.

  • Во-первых. Хорошим примером является release branch. Предположим, вы готовите выпуск на основе тщательно проверенной версии сундука. Вы делаете ветвь освобождения от требуемой ревизии магистрали. Теперь вы не будете затронуты никакими последующими модификациями багажника. Но вы можете захотеть зафиксировать исправления в ветке выпуска, и вам может потребоваться передать их в магистраль, не закрывая ветвь релиза. Это невозможно реализовать с помощью ветвей функций svn. С помощью svn вам придется подождать, пока ваша ветвь освобождения больше не понадобится, а затем реинтегрируйте ее. Или для резервного копирования исправлений вручную.
  • Во-вторых. Для каждой команды или для каждого разработчика. У вас нет готового примера, когда они действительно полезны, но вам это не понравится в svn. Было бы больно синхронизировать такие ветки.