Wewnętrzne modele danych są zasadniczo różne.
Zasadniczo, w SVN, patrząc na historię oddziału, widać tylko to, co się wydarzyło w tym oddziale. Kiedy więc połączysz z gałęzi B
do gałęzi A
, historia gałęzi A
będzie zawierała jedno duże zatwierdzenie zawierające wszystkie zmiany wprowadzone wyraźnie B
od czasu jej rozgałęzienia.
W pierwszych wersjach SVN, jeśli trzeba było ponownie połączyć gałąź B
z gałęzią A
, trzeba było ręcznie określić, który zakres wersji gałęzi B
chcesz scalić, aby uniknąć podwójnego scalenia tych samych wersji. Sprytny programista użyłby oczywiście komunikatu zatwierdzenia, takiego jak „Scalony w B: 1234”.
SVN 1.5 „naprawił” to. Nie zmieniło to jednak zasadniczego zastosowania fuzji. Po prostu dodał kilka dodatkowych metadanych do gałęzi A
, informując SVN, że wersja 1234 została scalona, umożliwiając SVN automatyczne wybranie prawidłowego zakresu wersji.
Ale to rozwiązanie jest w zasadzie obejściem dla modelu danych, który zasadniczo nie obsługuje śledzenia tego, co zostało scalone.
Scalenie dwóch gałęzi jest stosunkowo prostym przykładem. Ale obrazowanie tego bardziej złożonego scenariusza
- Utwórz oddział
A
z trunk
i dokonaj kilku zatwierdzeń tutaj
- Utwórz oddział
B
z A
i dokonaj kilku zatwierdzeń tutaj
- Dokonaj kilku zmian w
trunk
iA
- Połącz się
B
wtrunk
- Połącz się
A
wB
- Połącz się
A
wtrunk
- Scal
B
w trunk
(to nie powinno nic zrobić)
Prawidłowa obsługa tego modelu przy użyciu modelu metadanych staje się niezwykle skomplikowana (nie wiem, czy SVN rzeczywiście poprawnie obsługuje ten scenariusz i nie mam ochoty go testować).
Obsługa tego scenariusza w git jest niezwykle prosta.
W git, za każdym razem, gdy zatwierdzasz, wewnętrzny obiekt reprezentujący to zatwierdzenie zawiera odniesienie do poprzedniej nagłówka. Podczas scalania w gałęzi zatwierdzenie zawiera odniesienia do poprzedniego nagłówka wszystkich łączonych gałęzi (możesz połączyć więcej niż jedną gałąź jednocześnie w git)
Dlatego, gdy badasz historię pojedynczego zatwierdzenia w git, możesz zobaczyć całą historię, możesz zobaczyć, kiedy była rozgałęziona, kiedy została połączona, i możesz zobaczyć historię obu gałęzi między rozgałęzieniem a scaleniem.
Zatem podczas łączenia w oddziale, który został częściowo scalony, niezwykle proste jest ustalenie, co zostało już połączone, a co nie.
Nie mam doświadczenia z Mercurialem, ale podejrzewam, że jego wewnętrzne działanie jest podobne do git.
Zasadniczo więc dla SVN celem projektu było sprawienie, aby rozgałęzianie było tanie. Ale w git, celem projektu było, aby scalanie było tanie.
Wreszcie, kiedy ostatnio użyłem SVN, nie był w stanie obsłużyć scalania, w którym nazwa pliku została zmieniona w jednej gałęzi, a zmodyfikowana w innej.