Kiedy powinienem przestać zobowiązać się do opanowania nowych projektów?

26

Za każdym razem, gdy rozpoczyna się nowy projekt, zwykle warto zacząć od zobowiązania się do opanowania, dopóki nie uzyskasz czegoś „stabilnego”, a następnie zacznij pracę w oddziałach.

Przynajmniej tak zwykle to robię. Czy istnieje sposób na natychmiastowe uruchomienie gałęzi od drugiego zatwierdzenia? Czy ma sens robić to w ten sposób? Oczywiście „Initial Commit” zawsze będzie nadrzędne, ale potem, kiedy będę wiedział, że nadszedł właściwy czas, aby zacząć tworzyć gałęzie dla nowych funkcji?

Droogany
źródło

Odpowiedzi:

23

Natychmiast.

Kluczem jest pytanie, jaka jest polityka dla Mistrza. Z git zazwyczaj zasadą gałęzi w Master jest stabilna wersja do zbudowania . Czasami Master jest „główną linią”, w której rozgałęzienia są tworzone i łączone przed połączeniem z gałęzią Release. Są to dwa różne podejścia do roli / polityki.

Często źródłem błędów dla ludzi jest zmiana roli lub polityki oddziału w trakcie realizacji projektu. Samemu programistowi łatwiej jest przekazać te zmiany współautorom, ale próbuje przekonać kilkunastu programistów, by wszyscy rozpoznali: „Master jest teraz w wersji 1.0, proszę rozgałęzić funkcje, a nie wszystkich, którzy się do tego zachęcają”

Dotknąłem powyższego podejścia politycznego. Zasadą dla Master jest to, że jest to stabilna wersja do zbudowania . Sprawdzanie drobnych przyrostowych zmian w tym oznacza, że ​​nie masz przez cały czas czegoś stabilnego do zbudowania . Brak sprawdzania drobnych zmian jest sprzeczny z „mnóstwem małych (ale kompletnych) meldowań”, które wydają się być najlepszą polityką (i zachęcane przez łatwe rozgałęzianie).

Z perspektywy opartej na rolach, zacząłeś od roli głównej, głównej, wydania, konserwacji i ról programistycznych, a następnie niektórzy wskazywali drogę, rola rozwoju i konserwacji przenosi się do oddziałów. To znowu oznacza zmianę tego, co jest dozwolone na kapitanie i może mylić autorów co do tego, gdzie rzeczy należą. Może także (nieco) mylić historię oddziału, zachęcając do dużych zatwierdzeń, co oznacza większe i trudniejsze do zrozumienia fuzje.

Kluczowe role i zasady w oddziałach są proste i spójne od samego początku.

Ta „gałąź zmiany polityki” jest widoczna we Wzorach rozgałęziania . Pomysł przypisania ról każdej gałęzi można przeczytać w Zaawansowanych strategiach rozgałęziania SCM . Oba są bardzo dobrymi odczytami.


źródło
3
W większości się z tym zgadzam, ale nie powiedziałbym , że można budować , powiedziałbym , że można je uwolnić (stabilne). Wzorzec nie powinien zawierać kodu, który po prostu buduje, powinien zawierać kod, który został dokładnie przetestowany. Powinieneś być w stanie wyciągnąć z mistrza w dowolnym momencie, mając pewność, że nie będzie żadnych poważnych wad.
Aaronaught
Zgadzam się w pełni z Aaronaught, ponieważ IMHO jest całkowicie możliwe (i najlepsza praktyka) do pracy w taki sposób, że przejście od jednego stanu do zbudowania do następnego jest zawsze tylko niewielką, stopniową zmianą, nigdy dużą.
Doc Brown
1
@MichaelT Wiele razy widziałem gałęzie „deweloperów”, ale nigdy wcześniej nie słyszałem ich wyjaśnienia w kontekście „wczesnego mistrza”. Myślę, że wykorzystam to, dzięki.
Droogans
13

Istnieją głównie dwie sytuacje, w których zazwyczaj chcesz rozpocząć pracę z oddziałami:

  • gdy Ty lub Twój zespół musicie uruchomić nową funkcję, która ma najmniejszą szansę na to, że nie zostanie dodana do następnej wersji (która może być pierwszą wersją w historii), rozpocznij tworzenie w oddzielnej gałęzi funkcji

  • gdy musisz podać poprawki poważnych błędów do najnowszej wersji i chcesz utworzyć nową wersję poprawki zawierającą tylko te poprawki, ale żadnych nowo opracowanych (i prawdopodobnie niestabilnych) funkcji

Uważam, że przy podejmowaniu takich decyzji zawsze warto myśleć w kategoriach „nowych funkcji” lub „poprawek błędów” od momentu, w którym masz pierwszą kompilowalną / uruchamialną wersję swojego programu.

Michael Feathers wymienia cztery powody zmiany w swojej słynnej książce, ale w „gałęzi nowej funkcji” (dla funkcji niefunkcjonalnej) umieściłbym „optymalizację zasobów” oraz „ulepszenie projektu” najczęściej w „gałęzi nowej funkcji” , ponieważ IMHO nigdy nie należy ulepszać projektu, gdy nie jest to przeznaczone do ułatwienia implementacji określonej funkcji.

Doktor Brown
źródło
12

Jeśli podążasz za git-flow - i, szczerze mówiąc, myślę, że jesteś szalony, jeśli używasz Git i nie używasz tego modelu rozgałęziającego - to nigdy nie powinieneś się zobowiązać, masterdopóki nie będziesz gotowy na publiczne wydanie.

Twoje pierwsze zatwierdzenie masterpowinno być pustym repozytorium. Twoje następne zatwierdzenie masterpowinno być zatwierdzeniem scalania z developoddziału lub gałęzi tymczasowego wydania i powinno być stabilne, przetestowane i gotowe do wdrożenia (jeśli jest to aplikacja) lub dystrybucji publicznej (jeśli jest to biblioteka).

Tam inne modele rozgałęzienia Git, ale większość z nich pochodzą ze starszych modeli scentralizowane SCM i może prowadzić do poważnych problemów w środowisku DVCS. Nie musisz właściwie używać rozszerzenia git-flow i niekoniecznie potrzebujesz wszystkich gałęzi wydania / poprawki / funkcji, ale gołe kości to developi master, i pojawia się niestabilny kod develop.

Aaronaught
źródło
Nie potrzebujesz nawet tego pierwszego zobowiązania master. Pamiętaj, że mastergit nie jest niczym specjalnym, nie musi tam być. Możesz po prostu mieć dział rozwoju, dopóki nie chcesz wydać wydania.
Miles Rout
2
@MilesRout: Chociaż jest to w zasadzie prawdą, nie można scalić, chyba że gałąź już istnieje, a proces nakazuje, że każde zatwierdzenie do masterowania powinno być scaleniem nie do szybkiego przewijania do przodu. Chyba że jestem brakuje czegoś, jedyną alternatywą dla początkowej pusty commit byłoby oddziału mistrza off pewnym arbitralnym rozwijać popełnienia lub oddział uwolnienia, co oznaczałoby, że oni dzielić ten sam popełnić, czyli coś, czego powinniśmy unikać.
Aaronaught
1
Ach, to rzeczywiście dobry punkt. +1 do publikowania i komentowania.
Miles Rout
1

Neal Ford z Thoughtworks opowiada się za przełączaniem funkcji za rozgałęzianie, aby uniknąć problemu „scalenia piekła”. Rozważ przypadek, w którym dwóch programistów sumiennie łączy się codziennie z głównej gałęzi, a jeden z nich wprowadza znaczne zmiany w ciągu kilku tygodni, a następnie zatwierdza. Drugi programista mógłby równie dobrze skończyć w piekle. Aby uniknąć tego problemu, Ford zaleca „przyspieszenie bólu” (dobrze znany zwinny atrybut) poprzez posiadanie tylko jednej gałęzi i codzienne zaangażowanie. Dodatkowa funkcja jest dodawana za pomocą przełączników funkcji, które wyłączają tę funkcję do czasu jej pełnego przetestowania.

Wydaje się, że ta metodologia najlepiej sprawdza się w środowisku, w którym realizuje się ciągłe dostarczanie, ponieważ problemy z zatwierdzeniem zostałyby natychmiast wykryte.

Steve Emmerson
źródło
1

Minęły dwa lata od ostatniej odpowiedzi na to pytanie i myślę, że teraz historia się zmienia. Dla mnie odpowiedź brzmi: „Za każdym razem, gdy używasz kontroli kodu źródłowego do śledzenia wersji”.

Mówiąc dokładniej, w dzisiejszych czasach śledzenie wersji projektu z kontrolą kodu źródłowego nie zawsze działa. (na przykład używanie npm do zarządzania zależnością i określania wersji semantycznych za pomocą „^”). W takim przypadku artefakty projektu zmieniają się za każdym razem, gdy nastąpi kompilacja, przy czym niekoniecznie odpowiadają zmianom kodu źródłowego za każdym razem. Aby poradzić sobie z tego rodzaju nowymi wyzwaniami, niektóre zespoły decydują się na zbudowanie już „artefaktów” zapisanych w systemie kontroli artefaktów (np. JFrog Artifactory) dla wersji projektów torowych.

Oczywiście, gdy masz już kontrolę wersji artefaktów, nie wyciągasz „kodu produkcyjnego” z gałęzi GIT i nie budujesz / wdrażasz do produkcji, zamiast tego skonsultujesz się z systemem kontroli artefaktów w celu uzyskania wersji bezpośrednio uruchamialnych do wdrożenia. W takich przypadkach koncepcja „gałęzi wydania” nagle traci sens. I ilekroć twój zespół postanowi nie kojarzyć gałęzi git z wersją wydania, ponowne zatwierdzenie / pchnięcie bezpośrednio do mistrza staje się dobrym wyborem: staje się domyślną gałęzią za każdym razem, gdy repo jest klonowane, dlatego automatycznie przyjmuje semantykę powszechnie akceptowaną i dobrze komunikowaną zmiany. Mimo to, zgodnie z sugerowaną odpowiedzią, prawdopodobnie powinieneś przypisać rolę do gałęzi, w tym do master, i używać tych gałęzi tylko do tych konkretnych ról.

Na koniec idę o krok dalej i sugeruję wykorzystanie master jako gałęzi programistycznej w projektach z garstką kluczowych podmiotów odpowiedzialnych. Tak jest w przypadku mojego zespołu i prawdopodobnie tak samo w przypadku większości sklepów z mikro-usługami. Zatwierdzenie na master usuwa proces komunikacji zmian i potencjalnie unika „scalania piekła” podczas pracy nad funkcjami na wielu sprintach. Co więcej, kod w gałęzi master nie musi nawet „działać”, automatyczny proces kompilacji / testowania powie ci, co poszło nie tak, i tak łatwo sprawdzić historię gita i skontaktować się z autorem, który złamał kompilację / test :-)

Shawn
źródło
0

Mam zamiar zająć radykalne stanowisko: rozwinąć każdy pomysł. Po pierwsze, gałęzie git są tanie, głównym kosztem oddziału jest pamiętanie, po co jest. Zgadzam się również, że pierwsze zobowiązanie do opanowania jest kandydatem do wydania. Polecam zacząć od gałęzi proof of concept. Kiedy udowodnisz swoją koncepcję, możesz połączyć ją z pustą gałęzią deweloperską lub przepisać w zależności od tego, jak dobra jest twoja pierwsza próba. od tego momentu rozgałęziasz się z poziomu każdego błędu, funkcji, abstrakcji itp.

Hildred
źródło