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 Bdo gałęzi A, historia gałęzi Abędzie zawierała jedno duże zatwierdzenie zawierające wszystkie zmiany wprowadzone wyraźnie Bod czasu jej rozgałęzienia.
W pierwszych wersjach SVN, jeśli trzeba było ponownie połączyć gałąź Bz gałęzią A, trzeba było ręcznie określić, który zakres wersji gałęzi Bchcesz 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ł
Az trunki dokonaj kilku zatwierdzeń tutaj
- Utwórz oddział
Bz Ai dokonaj kilku zatwierdzeń tutaj
- Dokonaj kilku zmian w
trunkiA
- Połącz się
Bwtrunk
- Połącz się
AwB
- Połącz się
Awtrunk
- Scal
Bw 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.