Каковы различия между GIT и SVN, когда речь идет о слиянии конфликтов
Я продолжаю слышать, что ветвление в git намного проще, чем в SVN, потому что проще объединить ветку обратно в магистраль/мастер. Я прочитал несколько руководств, но они охватывали только основные конфликты слияния ( "Алиса изменила строку 8 кода .cpp и в то же время Боб изменил строку 8 кода .cpp..." ), и нет никаких различий между SVN и все другие системы управления распределенными источниками.
Можете ли вы привести примеры изменений в ветке, которые могут вызвать проблемы в репозитории SVN, но будут обработаны изящно git?
Ответы
Ответ 1
У меня наконец-то было время, чтобы возиться с ветвями/слиянием с git и svn и нашел случай, который убивает svn, но отлично работает с git:
Предположим, что проект состоит из этих файлов:
/main.cpp
/sub1/sub1.cpp
/sub1/sub1.h
- Создать ветку
- В trunk, переместите sub1. * в корневой каталог, удалите подкаталог sub1.
- В ветке внести некоторые изменения в /sub 1/sub1.cpp
- В trunk внести некоторые изменения в /sub 1.cpp
- Объединить ветку и соединительную линию.
SVN теряет все изменения, сделанные в ветке в точке 3, аналогичные изменения в git отлично сливаются. Этого достаточно для того, чтобы я отклонил SVN как систему контроля версий для любого проекта, который требует разветвления.
Ответ 2
hgInit.com относится к Mercurial, но даст вам очень хороший обзор разницы между DVCS и SVN для слияния конфликтов.
Причина, по которой Subversion имеет проблемы слияние связано с тем, как это происходит хранит историю версий. диверсия любит думать об изменениях. ревизия - это то, что весь файл система выглядела как момент времени. В Mercurial вы думаете о наборах изменений. Набор изменений - это краткий перечень изменений между одна ревизия и следующая ревизия.
Итак, Subversion сравнивает целые файлы при слиянии, в то время как Mercurial (или Git) сравнивает каждый набор изменений по отдельности. Конфликты встречаются гораздо реже при работе с наборами изменений.