2010-04-22 12 views
18

Jak sugeruje tytuł, jestem ciekawy, dlaczego tak wielu ludzi twierdzi, że Git jest lepszą alternatywą dla rozgałęziania/łączenia przez SVN. Jestem przede wszystkim ciekawy, ponieważ połączenie SVN jest do bani i chciałbym alternatywnego rozwiązania.Jaka jest różnica między SVN i Git do łączenia?

Jak Git radzi sobie z łączeniem lepiej? Jak to działa?

Na przykład, w SVN, jeśli mam następujący wiersz:

Hello World!

Następnie user1 zmienia go:

Hello World 1

następnie użytkownik2 zmienia go:

Hello World 12

Następnie użytkownik2 zobowiązuje, a następnie user1 zobowiązuje, SVN będzie wywołać konflikt. Czy Git może rozwiązać coś prostego?

+23

git nie może już czytać w myślach, niż svn. – Ether

Odpowiedz

26

To się nazywa połączenie z konfliktem, a żadne VCS nigdy nie rozwiąże tego problemu.
Musisz ręcznie rozwiązać proces scalania.

Jak wspomniano w Why merging in git is better than SVN, rzeczywista różnica jest w nagraniu historii zmian są:

który pozwala Git, aby pamiętać, co już połączone, zmniejszając znacznie występujące konflikty.

DAG

Tak więc, gdy przychodzi czas, aby zrobić połączyć z 5b nad do (a) oddział, możemy wykorzystywać informacje w DAG wiedzieć, że 3b i 2b są już zrobione


Więc to jest merge worflow że Git zajmie dużo bardziej wdzięcznie niż SVN:
Zobacz Merge Git vs. SVN dla konkretne przykłady.

+0

@VonC: Ale twój ma ładny obraz i link do odpowiedzi na temat niezdolności SVN do scalenia, którego nie mogłem podać żadnych szczegółów. +1! – Cascabel

+0

@Jefromi: tak, lubię ładny obrazek;) Właśnie dodałem odniesienie do innego pytania SO, które ładnie ilustruje trudności (dla SVN) do zarządzania "bardziej złożonymi schematami scalania", o których wspominasz w swojej odpowiedzi. – VonC

+0

Jak zrobiłeś to zdjęcie? –

13

Konkretny konflikt, o którym wspomniałeś, to zawsze nierozwiązywalny. Po prostu narzędzie do scalania nie ma pojęcia, która wersja powinna być przechowywana.

Git jest prawdopodobnie lepszy niż SVN w radzeniu sobie z rozwiązywalnymi konfliktami. Jego podstawową strategią scalania jest rekursywna, która znajduje wspólnego przodka dwóch commitów zmieniających ten sam plik i dokonuje trójstronnego scalenia. Ma również wbudowaną funkcję nagrywania i ponownego użycia rozwiązań konfliktów (git-rerere) oraz różne inne merge strategies dla specjalnych przypadków.

Zaletą Gita w łączeniu jest to, że jest częścią historii. Merge commit to commit z dwoma rodzicami. Model historii Gita (ukierunkowany acykliczny wykres) oczekuje, że będą takie zatwierdzenia.Oznacza to, że dalsze połączenia w przyszłości będą działały dokładnie tak, jak powinny. Zawsze. (Tak, czasami pojawiają się konflikty, ale są to rzeczywiste konflikty, a nie niemożność poradzenia sobie z scalaniem).

SVN, z drugiej strony, po prostu próbuje śledzić miejsce, w którym doszło do scalenia, ale jego model jest nadal z natury liniowy . Historia wciąż ma tylko jeden ciąg zatwierdzeń, a informacje o śledzeniu korespondencji dostarczają dodatkowej pomocy. Z tego, co słyszałem, SVN nie zawsze może poprawnie obsługiwać bardziej złożone schematy scalania. (Jednym z przykładów jest refleksyjne połączenie - połączenie A w B, a następnie B w A.)

+0

Byłem pierwszy! Przez 50 sekund! ... Ale spójrzmy prawdzie w oczy, twoja odpowiedź jest znacznie bardziej szczegółowa i dokładna;) +1 – VonC

Powiązane problemy