Jestem raczej nowy w szerokim świecie Git. Przeczytałem instrukcję i ćwiczyłem, ale jestem zdezorientowany kilkoma jej aspektami, których nie mogłem zrozumieć po wyszukiwaniu.
Zastanawiam się:
Kiedy w projekcie (po pierwszym zatwierdzeniu) jest odpowiedni moment na przygotowanie plików źródłowych? Tuż przed popełnieniem? Zaraz po dodaniu / usunięciu lub modyfikacji?
Jeśli pliki są umieszczane w połowie drogi między dwoma zatwierdzeniami, a następnie są modyfikowane, co dzieje się z Git? Czy trzeba dbać o zmiany treści, kiedy zostały wypowiedziane i czym się stały?
Jeśli utworzę nowy plik, ustaw go, a następnie chcę go usunąć, dlaczego Git prosi mnie o użycie flagi „-f”, a prosty plik „git -rm file.ext” nie działa?
Przeczytałem „Co oznacza etap” i różne inne tematy podręcznika i innych samouczków na Git, ale jak powiedziałem, nadal nie rozumiem powyższych kwestii.
Jeśli możesz, odpowiedz na pytania własnymi słowami i przykładami, aby mieć większą szansę na zrozumienie.
Dziękuję Ci.
git diff
igit diff --cached
są dobre, ale czasami chcę więcej).Odpowiedzi:
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 plikuB
i części pliku,C
które odnoszą się do pliku,A
ale nie części, które zależą od zmian w plikuB
(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 wA
.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 nimgit 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ę.
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ę).
źródło
git add -p
jest bardzo miły.Myślę, że traktujesz to zbyt poważnie. Inscenizacja to po prostu wybranie rzeczy, które chcesz uwzględnić w następnym zatwierdzeniu. Bardzo rzadko jest ważne, kiedy lub jak robisz inscenizację; a jeśli w danym momencie masz wiele etapowych i nieetapowych zmian, prawdopodobnie musisz zrewidować swój proces rozwoju.
Zwykle robię to tuż przed popełnieniem (chyba że zauważę literówkę, więc muszę wprowadzić korektę w ostatniej chwili i też ją wyretuszować). Proces jest następujący: edycja, uruchamianie testów, etap, zatwierdzanie. Jeśli wystąpisz przed testem, są szanse, że testy się nie powiodą i będziesz musiał wprowadzić zmiany i je też wystawić, więc dlaczego nie zostawić go do czasu zatwierdzenia?
Pokazuje różnicę między bieżącym stanem repozytorium a (ostatnie zatwierdzenie + zmiany etapowe). Po wprowadzeniu niektórych nowych zmian po prostu ponownie obliczy stan (ostatnie zatwierdzenie + zmiany etapowe).
Teraz zgaduję tutaj, ale prawdopodobnie dlatego, że informacje o inscenizacji mogą być ważne (inaczej nie wystawiłbyś ich na scenę), ale nie są jeszcze pod kontrolą wersji (jak plik, który można usunąć
git -rm
). Dlategogit
chce się upewnić, że wiesz, co robisz.źródło