Jak często zatwierdzać zmiany w kontroli źródła? [Zamknięte]

204

Jak często powinienem zatwierdzać zmiany w kontroli źródła? Po każdej małej funkcji, czy tylko w przypadku dużych funkcji?

Pracuję nad projektem i mam do wdrożenia długoterminową funkcję. Obecnie zobowiązuję się po każdym kawałku pracy, tj. Każdej zaimplementowanej podfunkcji i usuniętym błędzie. Popełniam nawet po dodaniu nowej porcji testów dla niektórych funkcji po wykryciu błędu.

Jestem jednak zaniepokojony tym wzorem. W produktywny dzień pracy mogę popełnić 10 zobowiązań. Biorąc pod uwagę, że używam Subversion, te zatwierdzenia wpływają na całe repozytorium, więc zastanawiam się, czy rzeczywiście dobrą praktyką jest tworzenie tak wielu?

Eli Bendersky
źródło
1
Człowieku, to pytanie nie jest oparte na opiniach i jest całkowicie poprawnym pytaniem z właściwą odpowiedzią. Zatwierdzanie to jakaś ważna umiejętność. Pomysł polega na tym, że musisz zatwierdzić działające i stabilne ulepszenie / funkcję / poprawkę dodaną do bazy kodu, w tym opisowe komunikaty zatwierdzania. jeśli jest koniec dnia i chcesz odejść, nie możesz po prostu popełnić zepsutego kodu i powiedzieć, że naprawisz go jutro, ponieważ lepiej jest użyć opcji rebase obok scalania, aby zachować ważne zatwierdzenia i wiadomości oraz zmiażdżyć niepotrzebne, jeśli po prostu chcesz zachować stan tymczasowy, musisz użyć git stash
Eric
Aby uniknąć dwuznaczności, jeśli w niektórych szczególnych sytuacjach konieczne było zatwierdzenie i wypchnięcie nieukończonego kodu, po powrocie i ponownym kontynuowaniu tej gałęzi, po zakończeniu czynności musisz zmienić poprzednie niepełne zatwierdzenie, a następnie wypchnąć je. to od Ciebie zależy, jak utrzymać pracujące drzewo w czystości i przydać się do retrospekcji, ale wierz w to lub nie, jeśli chodzi o znajdowanie i rozwiązywanie bardzo ukrytych lub subtelnych błędów lub słabych funkcjonalności. To ogromna pomoc, jeśli masz czyste i profesjonalne drzewo robocze, kiedy chcesz użyć narzędzi do debugowania git, takich jak - git blame lub git bisect
Eric

Odpowiedzi:

196

Za każdym razem, gdy kończę „pełną myśl” o kodzie, który się kompiluje i uruchamia, odprawiam. Zwykle kończy się to między 15-60 minutami. Czasami może to być dłuższe, ale zawsze próbuję się zameldować, jeśli mam wiele zmian w kodzie, których nie chciałbym przepisać w razie awarii. Zazwyczaj też upewniam się, że mój kod się kompiluje i odprawiam pod koniec dnia pracy przed powrotem do domu.

Nie martwiłbym się wprowadzaniem zbyt wielu zatwierdzeń / zameldowań. To naprawdę jest do bani, gdy trzeba coś przepisać, i miło jest móc cofać się w małych krokach na wszelki wypadek.

Chris Pietschmann
źródło
3
Prawdopodobieństwo złamania kompilacji przy takim podejściu rośnie dramatycznie. Uwaga, jeśli nie masz testów automatyzacji, które potwierdzają twoje zameldowanie - ludzie będą pukać do twoich drzwi, ponieważ je zablokowałeś.
Alex Weinstein,
57
Prawdopodobieństwo przerwania kompilacji przy takim podejściu nie rośnie, jeśli używasz rozproszonego systemu kontroli wersji.
skiphoppy
24
Chociaż liczba przerw w kompilacji rośnie wraz z częstszymi zatwierdzeniami, ilość czasu na naprawę awarii zmniejsza się, podobnie jak czas tracony na cofnięciu zatwierdzeń. Częste zatwierdzenia prowadzą również do wielu innych korzyści. Jeśli zepsuję kompilację, mam nadzieję, że wkrótce ją zepsuję i przy małym zatwierdzeniu, żebym mógł to szybko naprawić.
jyoungdev
26
A jeśli poświęcasz 2 tygodnie pracy, nie chcesz przeglądać jednego wielkiego zatwierdzenia, aby zobaczyć, który fragment kodu złamał kompilację. Częste zatwierdzanie pozwala izolować problemy do znacznie mniejszej bazy kodu, ponieważ wiesz, że zmieniła się tylko niewielka część kodu.
Steven Sproat
1
@MikeJ To wszystko zależy od tego, jak korzystasz z kontroli źródła. Ponadto, jeśli używasz czegoś takiego jak Git i pracujesz we własnym oddziale, nie wpłyniesz na wersję dla innych członków zespołu, a nawet potok CI / CD.
Chris Pietschmann
82

Kiedy mówisz, że obawiasz się, że twoje „zatwierdzenia wpływają na całe repozytorium” - czy masz na myśli fakt, że liczba wersji całego repozytorium wzrasta? Nie wiem, ile bitów używa Subversion do jego przechowywania, ale jestem pewien, że nie zabraknie numerów wersji! Wiele zmian nie stanowi problemu. Możesz popełnić dziesięć razy częściej niż facet z sąsiedztwa i wcale nie zwiększysz swojego śladu węglowego.

Pojedyncza funkcja lub metoda powinna mieć nazwę tego, co robi, a jeśli nazwa jest za długa, robi zbyt wiele. Próbuję zastosować tę samą regułę do zameldowania: komentarz dotyczący zameldowania powinien dokładnie opisywać, co dokonuje się zmiana, a jeśli komentarz jest za długi, prawdopodobnie zmieniam zbyt wiele naraz.

benzado
źródło
1
Podoba mi się twoje oświadczenie. Jeśli popełnisz dziesięć razy częściej, nie będzie żadnego problemu (ale prawdopodobnie będzie tak, jeśli popełnisz 1/10 razy).
Camilo Martin,
24

Osobiście zatwierdzam każdą logiczną grupę kodu, która jest skończona / stabilna / kompiluje i staram się nie opuszczać dnia bez popełniania tego, co zrobiłem tego dnia.

Kevin Sheffield
źródło
20

Jeśli dokonujesz poważnych zmian i obawiasz się, że możesz wpłynąć na inne osoby pracujące nad kodem, możesz utworzyć nową gałąź, a następnie scalić się z powrotem do linii głównej po zakończeniu zmian.

smo
źródło
12

Zobowiązuję się za każdym razem, gdy skończę z zadaniem. Zwykle zajmuje to od 30 minut do 1 godziny.

jop
źródło
12

Jeśli komentarz kontroli wersji jest dłuższy niż jedno lub dwa zdania, prawdopodobnie nie popełniasz wystarczająco często.

jmort253
źródło
7
A jeśli jest mniej, prawdopodobnie nie komentujesz dobrze.
JD Isaacks
11

Podążam za mantrą open source (parafrazowaną) - wcześnie popełnia, często popełnia.

Zasadniczo za każdym razem, gdy wydaje mi się, że dodałem użyteczną funkcjonalność (nawet niewielką) bez problemów innych członków zespołu.

Ta strategia częstego zatwierdzania jest szczególnie przydatna w środowiskach ciągłej integracji, ponieważ umożliwia testowanie integracji pod kątem innych działań programistycznych, umożliwiając wczesne wykrycie problemów.

paxdiablo
źródło
10

Nie zatwierdzaj kodu, który tak naprawdę nie działa. Nie używaj swojego repozytorium jako rozwiązania do tworzenia kopii zapasowych.

Zamiast tego wykonaj kopię zapasową niekompletnego kodu lokalnie w sposób zautomatyzowany. Time Machine dba o mnie, a na innych platformach jest mnóstwo darmowych programów.

Kevin Conner
źródło
25
Lub utwórz oddział. Po to są.
Brian Carlton
2
Kontrola wersji ma na celu zapobieganie utracie danych lub tworzeniu kopii zapasowych. Ale nie jest również przeznaczony do recyklingu. Należy zatwierdzić tylko kod, który się kompiluje, ale funkcja nie musi być kompletna, aby dokonać zatwierdzenia.
jmort253
8

Zasadą, której używam, jest odprawa, gdy grupa plików do odprawy może być objęta jednym komentarzem odprawy.

Zasadniczo ma to na celu zapewnienie, że zameldowania będą miały charakter atomowy i że komentarze mogą zostać łatwo przetrawione przez innych programistów.

Jest to szczególnie prawdziwe, gdy zmiany wpływają na plik konfiguracyjny (taki jak plik kontekstowy wiosny lub plik konfiguracyjny struts), który ma szeroki zakres aplikacji. Jeśli wprowadzisz kilka „grup” zmian przed zalogowaniem, ich wpływ nakłada się na plik konfiguracyjny, powodując scalenie dwóch grup.

belugabob
źródło
7

Nie sądzę, żebyś tak bardzo martwił się tym, jak często. Ważne jest tutaj, co, kiedy i dlaczego. Mówienie, że musisz dokonywać co 3 godziny lub co 24 godziny, naprawdę nie ma sensu. Zobowiązuj się, gdy masz coś do popełnienia, nie rób tego, jeśli nie masz.

Oto fragment moich zalecanych najlepszych praktyk w zakresie kontroli wersji :

[...] Jeśli wprowadzasz wiele zmian do projektu w tym samym czasie, podziel je na logiczne części i zatwierdź w wielu sesjach. To znacznie ułatwia śledzenie historii poszczególnych zmian, co pozwoli Ci zaoszczędzić dużo czasu, gdy będziesz próbować znaleźć i naprawić błędy później. Na przykład, jeśli wdrażasz funkcję A, B i C i naprawiasz błąd 1, 2 i 3, to powinno dać w sumie co najmniej sześć zatwierdzeń, po jednym dla każdej funkcji i jeden dla każdego błędu. Jeśli pracujesz nad dużą funkcją lub przeprowadzasz rozbudowane refaktoryzacje, rozważ podzielenie pracy na jeszcze mniejsze części i dokonaj zatwierdzenia po zakończeniu każdej części. Ponadto przy wdrażaniu niezależnych zmian w wielu modułach logicznych zatwierdzaj zmiany do każdego modułu osobno, nawet jeśli są one częścią większej zmiany.

Najlepiej, aby nigdy nie wychodzić z biura z niezatwierdzonymi zmianami na dysku twardym. Jeśli pracujesz nad projektami, w których zmiany wpłyną na inne osoby, rozważ użycie oddziału do zaimplementowania zmian i scalenia ich z powrotem do magistrali po zakończeniu. Wprowadzając zmiany w bibliotekach lub projektach, od których zależą inne projekty, a tym samym inne osoby, upewnij się, że nie złamiesz ich kompilacji, wprowadzając kod, który nie będzie się kompilował. Jednak posiadanie kodu, który się nie kompiluje, nie jest wymówką, aby uniknąć popełnienia błędu. Zamiast tego użyj gałęzi. [...]

Anders Sandvig
źródło
6

Twój obecny wzór ma sens. Pamiętaj, w jaki sposób korzystasz z tej kontroli źródła: co zrobić, jeśli musisz wycofać lub chcesz zrobić różnicę? Fragmenty, które opisujesz, wydają się w tych przypadkach dokładnie właściwą różnicą: diff pokaże dokładnie, co zmieniło się przy implementacji błędu # (określonego w logu kontrolnym), lub dokładnie, jaki nowy kod był dla implementacji funkcji. Podobnie wycofanie dotknie tylko jednej rzeczy na raz.

Domenic
źródło
6

Lubię też angażować się po zakończeniu pracy, która często jest kilka razy dziennie. Myślę, że łatwiej jest zobaczyć, co dzieje się w małych zobowiązaniach niż w dużych. Jeśli martwisz się zbyt dużą liczbą zatwierdzeń, możesz rozważyć utworzenie gałęzi i scalenie jej z powrotem do linii głównej, gdy cała funkcja zostanie zakończona.

Oto powiązany post na blogu: Coding Horror: Check In Ear, Check In Często

Mike Henry
źródło
Daje +1 Twojemu punktowi za mniejsze zmiany, co ułatwia śledzenie. Nie ma nic gorszego niż długi akapit w zatwierdzeniu CVS. Boli cię oczy i głowę.
jmort253
4

Jak powiedzieli inni, spróbuj zatwierdzić jedną logiczną porcję, która jest „kompletna” na tyle, aby nie przeszkadzała innym programistom (np. Buduje i przechodzi testy automatyczne).

Każdy zespół / firma deweloperów musi zdefiniować, co jest „wystarczająco kompletne” dla każdego oddziału. Na przykład, możesz mieć gałęzie funkcji, które wymagają jedynie zbudowania kodu, Trunk, który również wymaga kodu, aby przejść automatyczne testy oraz etykiety wskazujące, że coś przeszło testy kontroli jakości ... lub coś w tym rodzaju.

Nie twierdzę, że jest to dobry wzorzec do naśladowania; Podkreślam tylko, że sposób wykonania „zależy” od zasad Twojego zespołu / firmy.

jyoungdev
źródło
3

Moment, kiedy o tym pomyślisz.

(o ile to, co zameldujesz, jest bezpieczne)

shea241
źródło
3

Zależy od systemu kodu źródłowego i tego, co jeszcze masz. Jeśli korzystasz z Git, potwierdź za każdym razem, gdy zakończysz krok. Używam SVN i lubię zatwierdzać, kiedy skończę całą funkcję, więc co godzinę do pięciu godzin. Gdybym używał CVS, zrobiłbym to samo.

Kevin Conner
źródło
3

Zgadzam się z kilkoma odpowiedziami: nie wpisuj kodu, który się nie skompiluje; skorzystaj z osobistego oddziału lub repozytorium, jeśli masz obawy związane z „kopią zapasową” kodu lub jego zmian; sprawdź, kiedy jednostki logiczne są kompletne.

Inną rzeczą, którą chciałbym dodać, jest to, że w zależności od środowiska, stawka odprawy może się zmieniać w czasie. Na przykład wczesne sprawdzenie projektu po ukończeniu każdego funkcjonalnego elementu komponentu ma sens zarówno dla bezpieczeństwa, jak i historii zmian (myślę o przypadkach, w których wcześniejsze bity są refaktoryzowane, gdy są opracowywane późniejsze). Z drugiej strony w dalszej części projektu ważniejsza staje się całkowicie pełna funkcjonalność, szczególnie podczas opracowywania / testowania integracji. Połowa integracji lub połowa poprawki nikomu nie pomaga.

Jeśli chodzi o odprawę po każdej naprawie błędu: absolutnie, chyba że poprawka jest trywialna! Nic nie jest bardziej uciążliwe niż stwierdzenie, że jedno zameldowanie zawierało trzy poprawki, a jeden z nich należy wycofać. Najczęściej wydaje się, że w tej sytuacji deweloper naprawił trzy błędy w jednym obszarze i odwijał, która zmiana dotyczy tego, która poprawka jest koszmarem.

DocMax
źródło
3

Lubię też regularnie się zameldować. To jest za każdym razem, gdy mam krok do celu.

Zazwyczaj jest to co kilka godzin .

Moja trudność polega na znalezieniu kogoś, kto byłby w stanie przeprowadzić tak wiele recenzji kodu .

Zgodnie z naszą polityką firmy musimy dokonać przeglądu kodu, zanim będziemy mogli cokolwiek sprawdzić, co ma sens, ale nie zawsze w dziale jest ktoś, kto ma czas na natychmiastowe sprawdzenie kodu. Możliwe rozwiązania:

  1. Więcej pracy na odprawę; mniej meldunków == mniej recenzji.
  2. Zmień zasady odprawy firmy. Jeśli właśnie dokonałem refaktoryzacji, a testy jednostkowe są zielone, to może uda mi się złagodzić regułę?
  3. Odłóż zmianę na później, aż ktoś będzie mógł dokonać przeglądu i kontynuować pracę. Może to być problematyczne, jeśli recenzentowi nie podoba się kod i trzeba go przeprojektować. Żonglowanie różnymi etapami zadania poprzez zmiany „odkładania” na półce może stać się bałaganem.
GarethOwen
źródło
8
Zasady firmy dotyczące sprawdzania meldunków są rozsądne, ale niezgodne z szybkimi meldowaniami zapasowymi. W tym celu myślę, że warto pracować w oddziale i zameldować się tam bez konieczności sprawdzania, a oficjalne kontrole należy przeprowadzać tylko poprzez połączenie z pniem, z przeglądem kodu
Eli Bendersky,
@ Eli- Zgadzam się, użycie oddziału wydaje się najlepszym pomysłem. Robiliśmy to w naszej firmie, ale potem przestaliśmy. Nie pamiętam dokładnie, na czym polegał problem - ale myślę, że stawał się zbyt skomplikowany i okazał się zbyt skomplikowany dla faceta, który obsługuje procesy wydania i wdrażania.
GarethOwen 22.10.10
Ditto Eli. Inną opcją jest przegląd przed wydaniem lub inny kamień milowy. Sprawdzanie każdego meldowania / zatwierdzenia kontroli wersji jest okropne . To jest tak okropne, że utworzyłem lokalne repozytorium, aby w międzyczasie zatwierdzić gdzieś, dopóki nie będę mógł dokonać repozytorium w „głównym” repozytorium. (Zrobiłem to wcześniej, gdy serwer CVCS był niedostępny.)
jyoungdev
2

Lubię zatwierdzać zmiany co 30-60 minut, o ile kompiluje się czysto i nie ma regresji w testach jednostkowych.

TraumaPony
źródło
2

Cóż, możesz mieć własną gałąź, do której możesz przypisać tak często, jak chcesz, a kiedy skończysz z funkcją, możesz połączyć ją z głównym pniem.

Jeśli chodzi o częstotliwość Commits, myślę o tym w ten sposób, ile by mnie bolało, gdyby mój twardy dysk się zepsuł i nie popełniłem czegoś - kwant tego czegoś dla mnie to około 2 godzin pracy.

Oczywiście nigdy nie popełniam czegoś, co się nie skompiluje.

Vaibhav
źródło
to byłyby tylko 2 godziny bólu .. prawda? dlaczego to takie złe?
Kevin Conner,
2

Przynajmniej raz dziennie.

Hamish Smith
źródło
2

Nie mam określonego limitu czasu na zatwierdzenie, zwykle zatwierdzam po przejściu testu i jestem zadowolony z kodu. Nie zatwierdziłbym; t kodu, który się nie kompiluje lub jest w innym stanie, w którym nie czułbym się dobrze po powrocie w razie awarii

Crippledsmurf
źródło
2

Musisz zrównoważyć kompromis między bezpieczeństwem i możliwościami odzyskiwania z jednej strony, a łatwością zarządzania zmianami dla całego projektu z drugiej.

Najlepszy schemat, jaki zastosowałem, ma dwie odpowiedzi na to pytanie.

Użyliśmy 2 całkowicie oddzielnych repozytoriów: jedno było repozytorium dla całego projektu, a drugie było naszym osobistym repozytorium (wówczas korzystaliśmy z rcs).

Regularnie sprawdzaliśmy nasze osobiste repozytorium, prawie za każdym razem, gdy zapisywałeś otwarte pliki. Jako takie osobiste repozytorium było zasadniczo dużym, dalekosiężnym buforem cofania.

Gdy mieliśmy kawałek kodu, który można skompilować, przetestowaliśmy ok i został zaakceptowany jako gotowy do ogólnego użytku, został sprawdzony w repozytorium projektu.

Niestety system ten polegał na wykorzystaniu różnych technologii VCS, aby był wykonalny. Nie znalazłem zadowalającej metody osiągnięcia tych samych wyników przy użyciu dwóch VCS tego samego typu (np. Dwa repozytoria subversion)

Jednak uzyskałem akceptowalne wyniki, tworząc „osobiste” gałęzie programistyczne w repozytorium subversion - regularnie sprawdzając gałąź, a następnie łącząc się z bagażnikiem po zakończeniu.

Andrew Edgecombe
źródło
2

Jeśli pracujesz nad oddziałem, który nie zostanie zwolniony, zatwierdzenie jest zawsze bezpieczne.

Jeśli jednak udostępniasz go innym programistom, popełnienie niedziałającego kodu może być nieco denerwujące (szczególnie jeśli znajduje się w ważnym miejscu). Zwykle zatwierdzam tylko kod, który faktycznie „działa” - nie dlatego, że został w pełni przetestowany, ale upewniłem się, że faktycznie się kompiluje i nie kończy natychmiast.

Jeśli używasz zintegrowanego narzędzia do śledzenia błędów, pomocne może być wykonanie osobnych zatwierdzeń, jeśli naprawiłeś dwa błędy, aby dziennik zatwierdzeń mógł być zgodny z odpowiednimi błędami. Ale z drugiej strony, czasami jedna zmiana kodu naprawia dwa błędy, więc musisz po prostu wybrać, przeciwko któremu chcesz go usunąć (chyba że twój system pozwala jednemu zatwierdzić powiązanie z wieloma błędami)

MarkR
źródło
2

Nadal wierzę w zwrot „popełnij często, popełnij wcześnie”. Wolę zdecentralizowane VCS jak Mercurial i nie ma problemu, aby popełnić kilka rzeczy i przesunąć je później.

To jest naprawdę częste pytanie, ale prawdziwe pytanie brzmi: czy możesz popełnić niedokończony kod?

nieistniejący
źródło
1
Uważam, że niedokończony kod może zostać zatwierdzony, o ile jest odpowiednio zaprojektowany, aby można go było odizolować od reszty systemu. Na przykład, jeśli implementujesz funkcję głosowania, taką jak w przepełnieniu stosu, nikt nie będzie wiedział, że istnieje, jeśli interfejs użytkownika nie został jeszcze zbudowany.
jmort253
2

Ilekroć skończysz jakiś kod, który działa i nie spieprzy nikogo, jeśli dostanie go w aktualizacji.

I upewnij się, że odpowiednio skomentowałeś

Andy Lester
źródło