Git Staging: Kiedy na scenie? Co zrobić, jeśli później nastąpi modyfikacja

9

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.

Phil
źródło
1
Scenę tworzę za każdym razem, gdy kończę jakiś mały kawałek pracy (zbyt mały, by wykonać zatwierdzenie) lub przed pewnymi zmianami nie jestem pewien. Rób wszystko, co dla ciebie działa. Znajdź narzędzie (np. Git gui lub git cola) pokazujące zarówno etapy, jak i zmiany nieetapowane ( git diffi git diff --cachedsą dobre, ale czasami chcę więcej).
maaartinus

Odpowiedzi:

4

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 Bi części pliku, Cktóre odnoszą się do pliku, Aale 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 Ai wersję pliku, Cktó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 commitnastę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-ffzachowa również, że te funkcje żyły w unikalnej gałęzi).

Tj. Możesz zachować nawyk łączenia się z masteroddział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ę).

wirrbel
źródło
git add -pjest bardzo miły.
Vorac,
2

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.

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?

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?

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?

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).

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?

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). Dlatego gitchce się upewnić, że wiesz, co robisz.

fjarri
źródło