W Subversion (i CVS) repozytorium jest przede wszystkim. W git i mercurial tak naprawdę nie ma takiej samej koncepcji repozytorium; tutaj zmiany są głównym tematem.
+1
Problem związany z CVS / SVN wynika z faktu, że systemy te nie
pamiętają rodzicielstwa zmian. W Git i Mercurial zatwierdzenie może mieć nie tylko wiele dzieci, ale także wielu rodziców!
Można to łatwo zaobserwować za pomocą jednego z narzędzi graficznych gitk
lub hg
view
. W poniższym przykładzie gałąź # 2 została rozwidlona z # 1 w zatwierdzeniu A i od tego czasu została scalona raz (w M, połączona z zatwierdzeniem B):
o---A---o---B---o---C (branch #1)
\ \
o---o---M---X---? (branch #2)
Zwróć uwagę, że A i B mają dwoje dzieci, podczas gdy M ma dwoje rodziców . Te relacje są rejestrowane w repozytorium. Powiedzmy, że opiekun gałęzi nr 2 chce teraz scalić najnowsze zmiany z gałęzi nr 1, może wydać takie polecenie:
$ git merge branch-1
a narzędzie automatycznie rozpozna, że baza jest B - ponieważ została zapisana w zatwierdzeniu M, przodku końcówki # 2 - i że musi scalić wszystko, co wydarzyło się między B i C. CVS nie rejestruje tych informacji , ani SVN przed wersją 1.5. W tych systemach wykres wyglądałby następująco:
o---A---o---B---o---C (branch #1)
\
o---o---M---X---? (branch #2)
gdzie M jest po prostu gigantycznym „zduszonym” zatwierdzeniem wszystkiego, co wydarzyło się między A i B, nałożonym na M. Zauważ, że po wykonaniu czynu nie ma już śladu (z wyjątkiem potencjalnie czytelnych dla człowieka komentarzy) gdzie nie wywodzi się ani z tego, jak wiele zobowiązań zostało razem upadłych - czyniąc historię znacznie bardziej nieprzeniknioną.
Co gorsza, wykonanie drugiego scalenia staje się koszmarem: trzeba dowiedzieć się, co baza seryjnej był w momencie pierwszego scalenia (i jeden ma do wiedzieć
, że doszło do seryjnej w pierwszej kolejności!), A następnie obecny że informacje do narzędzia, aby nie próbowało odtworzyć A..B na początku M. Wszystko to jest wystarczająco trudne podczas pracy w ścisłej współpracy, ale jest po prostu niemożliwe w środowisku rozproszonym.
Problem (pokrewny) polega na tym, że nie ma sposobu, aby odpowiedzieć na pytanie: „czy X zawiera B?” gdzie B to potencjalnie ważna poprawka błędu. Dlaczego więc nie zapisać tej informacji w zatwierdzeniu, skoro jest ona znana w czasie scalania!
P.-S. - Nie mam doświadczenia z możliwościami scalania SVN 1.5+, ale przepływ pracy wydaje się być znacznie bardziej skomplikowany niż w systemach rozproszonych. Jeśli tak jest, to prawdopodobnie dlatego, że - jak wspomniano w powyższym komentarzu - nacisk kładziony jest na organizację repozytorium, a nie na same zmiany.