Celem obszaru przeciwstawnego jest stworzenie elastycznej przestrzeni do zatwierdzenia. Myślę, że stanie się to wyraźniejsze, jeśli skontaktujesz git z scentralizowanymi systemami kontroli wersji, takimi jak subversion.
Obalenie
W subversion możesz wybrać, aby zatwierdzić pewne pliki kopii roboczej. Ale tylko pełne pliki. Teraz: Co zrobić, jeśli chcesz wykonać etap pliku A
, a nie pliku B
i części pliku, C
które odnoszą się do pliku, A
ale nie części, które zależą od zmian w pliku B
(od tego czasu miałbyś problem ze spójnością zatwierdzania).
Git
Git rozwiązuje to, podając, że inscenizacja jest drugą kopią roboczą. W obszarze przeciwności tworzysz migawkę, którą popełnisz (z grubsza mówiąc).
Dlatego w obszarze pomostowym można utworzyć migawkę zawierającą zmiany A
i wersję pliku, C
która odzwierciedla tylko zmiany w A
.
Dla konkretnych pytań
Możesz występować w dowolnym momencie. osobiście wolę występować tuż przed uruchomieniem zatwierdzenia.
Po wprowadzeniu zmian w pliku przemieszczonym, a następnie zmianie tego pliku w kopii roboczej, oczywiście nie zmieniłeś pliku tymczasowego. Możesz zdecydować, czy chcesz je wystawić, czy też nie, aby wprowadzić zmiany. To znaczy, jeśli uruchomisz git gui citool
, zobaczysz różnice między wersjami etapowymi i nieetapowymi (ładne i proste narzędzia do inscenizacji i zatwierdzania linii).
Git jest tutaj ostrożny, co prawdopodobnie jest dobrą rzeczą.
Ogólna strategia zatwierdzania: szczegółowe zatwierdzanie
Wydaje mi się, że mówiąc o pytaniu „Kiedy powinienem występować”, należy również mówić o nawykach związanych z popełnianiem błędów.
Scentralizowany VCS
W scentralizowanych systemach kontroli wersji, w których angażujesz się na centralnym serwerze, ważne było dla twoich współpracowników, aby twoje zobowiązania były kompletne i dobrze przetestowane. Dlatego ludzie próbują popełniać niezbyt często, a następnie zatwierdzać stan kompletnych plików, aby zminimalizować możliwość wystąpienia błędu. Dlatego zatwierdzenia są zwykle dość dużymi fragmentami, które zawierają wiele zmian (jeśli nie są to proste poprawki). Zmiany w zatwierdzeniu mogą być całkowicie niezwiązane.
Git
W Git zatwierdzenie jest wykonywane lokalnie, tylko wypychanie ich na serwer czyni je publicznymi. Dlatego zatwierdzenie jest w pewnym sensie tanie . Zatwierdzenie w sensie subwersji jest raczej porównywalne do kilku git commit
następujących po nim git push
. Ta różnica ma znaczenie.
Git pozwala zatwierdzać pojedyncze wiersze kodu, nawet jeśli zmieniłeś także inne wiersze w tym samym pliku. Daje to wiele korzyści, ponieważ można na przykład naprawić błąd bezpieczeństwa w wierszu 100, zmieniając wiersze 300–350 i wprowadzając nową funkcję.
- Możesz rozdzielić różne zmiany w różnych zatwierdzeniach. To ładnie oddziela je w historii wersji, a nawet pozwala cofnąć jedno, ale nie drugie.
- Twoje zatwierdzenie niekoniecznie musi odzwierciedlać stan „kompilacji” twojej kopii roboczej (chociaż staram się tak zachować).
Więc gdzie jest „kontrola jakości” i gwarancja kompilacji w zatwierdzeniu, której oczekiwałby użytkownik subversion? Został przeniesiony do innych akcji w git. Nadal chcesz wypchnąć funkcjonujący stan programu w publicznym repozytorium. Dlatego upewnij się, że testy się powiodły, a program działa przed wypchnięciem swoich zmian.
Spróbuj także wykorzystać gałęzie do maksimum. Przy wprowadzaniu wielu drobnych zmian skończysz z dość dużą historią wersji. Jeśli pracujesz w gałęziach, możesz kategoryzować te szczegółowe zatwierdzenia według nazwy gałęzi, a następnie scalić je z powrotem (opcja --no-ff
zachowa również, że te funkcje żyły w unikalnej gałęzi).
Tj. Możesz zachować nawyk łączenia się z master
oddziałem tylko wtedy, gdy oddział jest w dobrym stanie. Możesz także użyć tagów do śledzenia kamieni milowych i wydań.
Teraz powróć do inscenizacji: po zatwierdzeniu kilku linii na zatwierdzenie przejdziesz bezpośrednio przed zatwierdzeniem. (Przynajmniej tak to robię).
git diff
igit diff --cached
są dobre, ale czasami chcę więcej).