2014-05-07 19 views
6

Nie jestem pewien, czy mogę zaufać Git, aby się połączyć automatycznie. Oto scenariusz.Jak mogę zaufać Git scalić?

Tworzenie programu w Master:

MOVE 0 TO I. 
A. 
    PERFORM X-PROC. 
    IF I IS EQUAL TO 25 THEN GO TO A. 

Twórca 1 sprawia, że ​​oddział i zauważa, że ​​jest to błąd: nieskończona pętla. On naprawia go:

MOVE 0 TO I. 
A. 
    ADD 1 TO I. 
    PERFORM X-PROC. 
    IF I IS EQUAL TO 25 THEN GO TO A. 

Tymczasem Twórca 2 sprawia, że ​​oddział i rozwiązuje problem na swój sposób:

MOVE 0 TO I. 
A. 
    PERFORM X-PROC. 
    ADD 1 TO I. 
    IF I IS EQUAL TO 25 THEN GO TO A. 

Zarówno deweloperzy przetestować swój kod i uważają, że jest poprawne. Obie łączą się z mistrzem:

MOVE 0 TO I. 
A. 
    ADD 1 TO I. 
    PERFORM X-PROC. 
    ADD 1 TO I. 
    IF I IS EQUAL TO 25 THEN GO TO A. 

Nieskończona pętla powróciła.

Wydaje mi się, że problem ten musi występować często w dowolnym rozproszonym środowisku programistycznym. Kiedy to testowałem, Git nie zgłosił konfliktu scalania. Czasami ten problem mógł pozostać niezauważony przez długi czas. Test regresji powinien go znaleźć, ale testy regresji są również połączone w Git, więc nie możemy im ufać.

Co mogę z tym zrobić? Czy po każdym scaleniu muszę wykonać odczyt kodu?

Odpowiedz

9

Czy po każdym scaleniu muszę wykonać odczyt kodu?

Tak, oczywiście.

Algorytmy Automerge są pomocne, ale nie są magiczne; zawierają tylko zmiany, które zostały wprowadzone do obu stron pliku, jeśli nie powodują konfliktów. Nie ma gwarancji, że wynikowa zmiana się skomplikuje lub nawet nie jest bełkotem. Nie ma żadnej gwarancji, że logika nie jest kompletnym wrakiem pociągu. (Niektórzy spekulowali, że błąd Heartbleed był wynikiem automatycznej zmiany logiki subtelnie i nie został zauważony).

Jest to prawdziwe w przypadku każdego narzędzia kontroli wersji, które wykonuje automerge (który, z założenia, korzystasz z coś, co zostało napisane w ciągu ostatnich 15 lat, prawie na pewno robi.) Chociaż nie jest to impeach automerge, które rozwiązuje dwie zmiany w tym samym pliku i ogólnie robi dobrą robotę; dotyczy to również scalenia w ogóle. Jeśli zmodyfikujesz jakiś plik A i zmodyfikuję jakiś plik B, nie ma gwarancji, że scalenie ma sens.

Najlepsza praktyka: należy zawsze sprawdzić scalenia przed zatwierdzeniem lub przekazaniem ich, nawet jeśli automerge pomyślnie.

+4

Zestawy testów/testy jednostkowe są wspaniałym narzędziem do zmniejszenia obciążenia pracą, jeśli masz do czynienia z gigantycznymi połączeniami (które zwykle nie powinno Ci się zdarzyć) - ale nie popadaj w fałszywe poczucie bezpieczeństwa i zaniedbuj kontrolę stanu zdrowia, łącząc się, tylko dlatego, że wszystkie testy minęły! –

+1

Jedną z technik, której używam do sprawdzenia, czy scalanie jest mniej bolesne, jest zajęcie się różnicą gałęzi przed i po scaleniu z inną gałęzią, a następnie porównanie tej różnicy (za pomocą programu różnicowego) z różnicami wprowadzonymi w inna gałąź. Jeśli nie ma różnicy między różnicami, to mogę mieć większą pewność, że scalenie nie zostało spartaczone. –

+0

Dziękuję NevikRehnel i @ cupcake - Chciałbym usłyszeć, że wszystkie strategie kontroli stanu zdrowia łączą się! –