Mamy produkt, który ma kilka różnych wydań. Różnice są niewielkie: różne ciągi tu i tam, bardzo mało dodatkowej logiki w jednej, bardzo mała różnica w logice w drugiej. Podczas opracowywania oprogramowania do każdej edycji należy dodać większość zmian; jest jednak kilka takich, które się nie różnią, i kilka, które muszą się różnić. Czy jest to poprawne użycie gałęzi, jeśli mam gałęzie release-editionA i release-editionB (..etc)? Czy są jakieś problemy? Dobre praktyki?
Aktualizacja: Dziękujemy za wgląd wszystkim, wiele dobrych odpowiedzi tutaj. Ogólny konsensus wydaje się być taki, że używanie gałęzi do tego celu jest złym pomysłem. Dla każdego, kto zastanawia się, moim ostatecznym rozwiązaniem problemu jest uzewnętrznienie ciągów jako konfiguracji i uzewnętrznienie odmiennej logiki jako wtyczek lub skryptów.
Odpowiedzi:
Zależy to od wielkości zmiany, ale nie uważam tego za dobrą praktykę w odniesieniu do różnic, które opisałeś.
Ogólnie rzecz biorąc, chcesz, aby gałąź Git była czymś, co zostanie scalone w przyszłości lub zapisane tylko do odczytu w celach informacyjnych. Git, które współistnieją w nieskończoność, oznacza pracę dla wszystkich: zmiany muszą być propagowane i łączone, konflikty rozwiązywane, cała zabawa. Co więcej, każdy programista musi pamiętać o wprowadzeniu zmian do pięciu repozytoriów zamiast do jednego.
Jeśli masz małe zmiany, cały proces łączenia i prowadzenia oddziałów wydaje się przesadny w porównaniu do problemu. Użyj swojego preprocesora lub systemu kompilacji, aby rozróżnić wersje. Czy proste
#ifdef
rozwiązuje problem? Więc nie rozwiązuj problemów z git, to przesada.źródło
Nie do tego naprawdę służą gałęzie. Oddziały powinny być krótkimi lub średnioterminowymi ścieżkami bocznymi do linii rozwoju, a nie długoterminowymi równoległymi wersjami tego samego kodu.
Umieściłbym wszystkie różne wersje w tym samym oddziale, z podkatalogami części, które różnią się między edycjami, i skonfigurowałem proces kompilacji (masz kompilację automatyczną, prawda?), Aby mogła ona wypisać dowolną edycję na żądanie (lub wszystkie jednocześnie).
W końcu chcesz zachować „pojedyncze źródło prawdy”; z gałęziami będziesz kopiować część kodu, ale nie wszystkie, a pewne połączenia w rzeczywistości popsułyby konfigurację.
źródło
EditionA
,EditionB
etc.) i tym tego rodzaju zajęciach warunkowo wcsproj
plikach (np<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'EditionA|AnyCPU' "
>). Zautomatyzowane kompilacje mogą wykorzystywać te różne konfiguracje do budowania projektu. Co myślisz?Jednym z rozwiązań - jak zauważyli ludzie - jest skonfigurowanie systemu kompilacji do obsługi różnych wydań.
Zastanowiłbym się również nad jego wdrożeniem jako przełączaniem funkcji i skorzystaniem z pliku konfiguracyjnego. Im mniej musisz budować, tym lepiej.
Zajrzyj na tę stronę.
źródło
Sądzę, że to dobry pomysł, pod warunkiem, że nie da się tego zrobić w ramach jednej gałęzi bez zbytniego skupiania kodu.
Wolałbym móc trzymać go w jednym oddziale i używać plików zlokalizowanych i konfiguracyjnych, szczególnie jeśli powiesz, że różnice są niewielkie.
Innym sposobem mogą być różne kompilacje, na przykład plik kompilacji zawiera różne pliki dla różnych klientów, ale widzę też narzędzie kompilacji sprawdzające różne gałęzie. Gdy używasz git, powiedziałbym, że nie ma prawdziwych gotch. Jedną strategią rozgałęziania może być opracowanie w różnych gałęziach dla różnych zadań, zameldowanie w głównej gałęzi i łączenie od głównej do edycji X i Y.
źródło
To brzmi bardziej jak zadanie dla różnych konfiguracji kompilacji. Odpowiedź Thitona idzie w tym kierunku, ale wziąłbym ją o wiele dalej niż
#ifdef
:Użyj różnych celów kompilacji, aby zbudować różne wersje oprogramowania. Cele mogą się różnić
To wstępne przetwarzanie może oczywiście obejmować klasyczny preprocesor C, ale może również wymagać użycia niestandardowego preprocesora, silnika szablonów do tworzenia niestandardowych widoków…
W ten sposób unikasz konieczności aktywnego wypychania każdej zmiany do wielu gałęzi, co narusza OSUSZANIE (oczywiście to też można zautomatyzować, ale nie widzę korzyści).
źródło
Używałbym gałęzi tylko do znaczących zmian, w przeciwnym razie kończysz dodawanie każdej drobnej zmiany do wielu gałęzi, co wcale nie jest fajne i jest bardzo podatne na błędy, szczególnie jeśli pracujesz z większą liczbą osób.
źródło
Jeśli wydajesz je wszystkie jako różne produkty, zalecane jest posiadanie wielu oddziałów. Jeśli nie, nadal zaleca się użycie czegoś takiego jak pień lub gałąź główna.
Myślę też, że będzie to zależeć od twojego procesu rozwoju, szczególnie wdrożenia. Jeśli masz proces, który pozwala na wdrożenie tylko jednej gałęzi do produkcji, a gałęzie są traktowane jako „kompilacje przyrostowe”, co oznacza, że wersja B nie może zostać wdrożona do produkcji, chyba że wersja A została wdrożona jako pierwsza, biorąc pod uwagę, że wszystkie zmiany A są już w B, więc posiadanie wielu gałęzi jest dobrym rozwiązaniem. Działa to, jeśli masz zespoły rozrzucone po całym świecie i zwykle masz zmiany uporządkowane według priorytetów.
źródło
Rozwiązanie z trzema różnymi gałęziami (w zakresie produkcji, rozwoju i funkcji) działa naprawdę dobrze. Załóżmy, że odkryłeś jakiś błąd w kodzie produkcyjnym, a następnie możesz zastosować łatkę, a następnie go zwolnić. Tylko upewnij się, że nie wprowadzasz żadnych dodatków do gałęzi produkcyjnej ani żadnych poważniejszych zmian w gałęzi produkcyjnej. Ty i Twój zespół będziecie musieli się zdyscyplinować, aby nie wprowadzać żadnych poważniejszych zmian w swojej branży produkcyjnej. Oddział produkcyjny powinien zajmować się jedynie drobnymi poprawkami, które nie gwarantują poważnych zmian w bazie kodu produkcyjnego.
źródło