Rozumiem już większość podstawowych koncepcji Git / Github, ale nadal mam problem ze zrozumieniem szerszego obrazu.
Oto niektóre rzeczy, które udało mi się dotychczas uruchomić:
- Push commits
- Praca z oddziałami
- Zintegruj Github z Travis CI, systemem ciągłej integracji
- Poprzez Travis CI, automatycznie buduj na każdym zatwierdzeniu do masterowania i umieść wydanie jako ZIP na Github w ramach wydań.
Jednak do tej pory pracowałem tylko nad wersjami alfa / beta projektów, więc nigdy nie widziałem wersji z wersjami w praktyce.
Dlatego chcę dowiedzieć się więcej o wersjonowaniu, utrzymywaniu osobnych wersji, poprawianiu wersji itp.
Jak mogę się upewnić, że następujące rzeczy się zdarzają:
- Posiadaj różne wersje mojego projektu, na przykład wersje 1.1.0 i 2.0.0
- Masz możliwość wypychania poprawek do wersji, niejako sprowadzania wersji do 1.1.1 lub 2.0.1 itp.
- Spraw, aby system ciągłej integracji budował tę wersję automatycznie po zatwierdzeniu, a jeśli się powiedzie, opublikuj wydanie dla tej konkretnej wersji.
Wątpię między następującymi opcjami:
- Czy muszę używać tagów do każdej wersji? Jeśli tak, to w jaki sposób system ciągłej integracji może budować wersje automatycznie?
- Czy powinienem tworzyć gałęzie dla każdej wersji? Jeśli tak, czy nie stworzyłoby to całej tony gałęzi (jak gałąź 1.1 i 2.0, poprawki trafiają oczywiście na tę gałąź)
- Jak określić numer wersji? Czy plik konfiguracyjny, który określa numer wersji, jest w porządku, czy można to zrobić lepiej? W tym przypadku byłby to projekt Java, jeśli to ma znaczenie.
Odpowiedzi:
Powinieneś spojrzeć na git-flow . To doskonały (i popularny) model rozgałęziania.
Podsumowanie Git Flow
Rozgałęzienie
Główne pnie, które pozostają na zawsze, to
develop
imaster
.master
zawiera najnowszą wersję idevelop
najnowszą „stabilną” kopię rozwojową.Współpracownicy tworzą
feature
oddziały (poprzedzonefeature/
konwencją) zdevelop
:i
hotfix
gałęzie (poprzedzonehotfix/
konwencją) zmaster
:Gałęzie te są „jednorazowe”, co oznacza, że mają krótką żywotność, zanim zostaną ponownie połączone z głównymi pniami. Mają one obejmować małe elementy funkcjonalności.
Wykończenie oddziałów
Kiedy współautor zakończy działanie z
feature
oddziałem, łączy go z powrotem wdevelop
:Kiedy skończysz z
hotfix
oddziału, oni połączyć go z powrotem do obumaster
, adevelop
więc poprawka przenosi:Jest to aspekt ciągłej integracji.
Prasowe
Kiedy jesteś gotowy, aby rozpocząć pakowanie wersji, tworzysz
release
gałąź ze swojej gałęzi „stabilnej”develop
(tak samo jak tworzeniefeature
gałęzi). Następnie podbijasz numer wersji w znaczniku (opisanym poniżej).Korzystanie z oddzielnych
release
gałęzi pozwala kontynuować rozwijanie nowych funkcjidevelop
podczas usuwania błędów i dodawania ostatnich poprawek dorelease
gałęzi.Kiedy jesteś gotowy, aby zakończyć wydanie, scalasz
release
gałąź w jednomaster
i drugiedevelop
(tak jak ahotfix
), aby wszystkie zmiany były kontynuowane.Tagowanie
Kiedy tworzysz
release
gałąź lubhotfix
gałąź, odpowiednio podbijasz numer wersji w znaczniku. W przypadku waniliowego git wygląda to tak:Będziesz także musiał wypchnąć tagi (osobno) do zdalnego repozytorium:
Zazwyczaj najlepiej jest używać wersji semantycznej, w której twoje wersje mają formę
major.minor.hotfix
. Poważne wypukłości są niezgodne wstecz, natomiast drobne wypukłości i poprawki nie są niezgodne wstecz (chyba że jesteś w fazie beta0.x.x
).Scalanie
Jak widać powyżej, git-flow zachęca do łączenia gałęzi za pomocą następującego polecenia:
Ta
--no-ff
opcja pozwala zachować całą historię gałęzi bez pozostawiania wiązki gałęzi leżącej w bieżącym zatwierdzeniu repozytorium (więc nie martw się, nie będziesz miał gałęzi dla każdej wersji).Zachęcamy również do ciągnięcia
Więc nie dodajesz wielu bezużytecznych zatwierdzeń scalania.
Możesz skonfigurować git, aby domyślnie robił obie te rzeczy w twoim
.gitconfig
. Pozwolę ci jednak spojrzeć na to;)Przeglądanie wersji
Gdy ktoś szuka konkretnej wersji bazy kodu, może pobrać tag według nazwy:
Lub, jeśli ktoś przegląda na githubie, w rozwijanym menu „oddziałów” znajduje się także zakładka „tagi”.
Korzystanie z rozszerzenia git-flow (zalecane)
Moim ulubionym sposobem użycia tego modelu jest rozszerzenie git flow dla git.
( Edycja: Louis zalecił widelec AVH, który działa lepiej
git describe
i może być teraz bardziej aktywny. Dzięki Louis.)Rozszerzenie automatyzuje wszystkie niechlujne części (takie jak używanie
merge --no-ff
i usuwanie gałęzi po scaleniu), abyś mógł zacząć życie.Na przykład za pomocą rozszerzenia możesz utworzyć gałąź funkcji w następujący sposób:
i dokończ tak
Polecenia dotyczące poprawek i wydań są podobne, chociaż używają numeru wersji zamiast nazwy oddziału, na przykład:
Następnie Git flow tworzy dla Ciebie znacznik wersji i uprzejmie przypomina, aby podnieść wersję w dowolnym pliku konfiguracji lub pliku manifestu (co można zrobić za pomocą menedżera zadań, takiego jak chrząknięcie).
Mam nadzieję, że to pomoże :) Nie jestem pewien, jak dokładnie zintegrowałbyś to wszystko z konfiguracją Travis CI, ale zgaduję, że dostaną się tam githooki.
źródło
v0.3.0
, dla<release>
git flow release start <release> [<base>]
. Pod maską utworzy nazwę gałęzi, w tym wersję, nprelease/v0.3.0
.Czy muszę używać znacznika do każdej wersji?
Nie, wcale nie musisz używać tagów. Jeśli chcesz otagować każdą wersję, to dobrze, lub jeśli chcesz otagować za każdym razem, gdy budujesz system CI, możesz to zrobić. Znaczniki w zasadzie nadają jedynie zatwierdzoną nazwę zatwierdzeniu, dzięki czemu można łatwo wyciągnąć ją i wyświetlić później.
Czy powinienem tworzyć gałęzie dla każdej wersji?
Pewnie! Rozgałęzianie jest tanie / darmowe w Git, więc korzystam z niego przy każdej okazji. Możesz także dość szybko łączyć i usuwać gałęzie. Jeśli czujesz, że masz wiele oddziałów, zawsze możesz je później zredukować, dokonując selektywnego łączenia. Istnieje wiele schematów rozgałęzień Git, jeśli chcesz użyć wypróbowanego i prawdziwego schematu.
Jak określić numer wersji?
Tagi są zwykle sposobem, w jaki podajesz numer wersji, ponieważ dotyczy git. Jeśli mówisz o tym, jak wykonać wersję projektu lub jak to zrobić najlepiej, będziesz musiał kopać, ponieważ jest to pytanie oparte na dość opiniach. Niektóre projekty pozostają w wersji Beta na zawsze, inne zwiększają wersje liczbowe, jakby wychodziły z mody (Patrząc na ciebie, chrom)
źródło
Jeśli przez „wersję” rozumiesz zestaw plików, które składają się na wydanie lub kandydata do wydania, zdecydowanie zalecamy oznaczenie każdej wersji tagiem. Jeśli chcesz odwołać się do wersji 1.2.7, czy chcesz poszukać skrótu zatwierdzenia, czy po prostu użyć numeru wersji?
Także jeśli użyjesz
git describe
do zapisania gdzieś informacji o kompilacji (tak jak ja), to użycie tagów pozwala uzyskać znacznie ładniejszy wynik.System ciągłej integracji może budować wersje bez względu na sposób używania tagów. Można powiedzieć, aby zbudował wydanie na podstawie skrótu zatwierdzenia. Tagi ułatwiają Ci życie.
Nie uważam rozgałęziania za coś „na wersję”. Mam kilka projektów, w których wszystkie moje wersje są zatwierdzone w
master
oddziale. Nie muszę nic bardziej skomplikowane niż to teraz , bo ani projekt jest na etapie stabilny i nie ma potrzeby, aby wspierać starsze wersje długoterminowo. Ale powiedzmy, że wypuszczam wersje 1.0, 1.1, 1.2, a następnie wypuszczam wersję 2.0 i nadal muszę obsługiwać serię 1.0 poprawkami bezpieczeństwa itp. W takim razie z pewnością miałbym oddział, w którym można by zainstalować wersje konserwacyjne serii 1.x .Posiadanie jednego źródła numeru wersji, takiego jak plik konfiguracyjny, jest najlepszym sposobem, ponieważ zapobiega błędom grubego palca, które mogłyby wystąpić, gdybyś musiał zaktualizować numery w wielu miejscach. Mówię z ... hmm ... żenującego doświadczenia. W wersji 1.3 okazuje się, że oprogramowanie nadal zgłasza, że jest w wersji 1.2. Ups!
W innej odpowiedzi mxdubois polecił ci gitflow. Jeśli zdecydujesz się użyć gitflow, polecam korzystanie z edycji AVH . Oryginalna wersja nie jest już aktywnie utrzymywana. Istotną różnicą jest to, że edycja AVH wykonuje scalenia wersji, które pozwalają
git describe
na inteligentną pracę. Oryginalna wersja wykonuje scalanie w sposób, który się uruchamiagit describe
.źródło
Skanuję listę Widzę wersję jako główny cel, więc ...
Jednym ze sposobów utrzymania wersji jest rozgałęzienie i scalenie (lub zmiana wersji).
Więc masz:
następnie tworzysz gałąź
następnie dodajesz więcej zmian do
następnie tworzysz gałąź
następnie dodajesz więcej zmian do
Teraz:
Aby zaktualizować wersję 2, teraz robisz
Aby zaktualizować wersję 3
Powyższe dotyczy aktualizacji hurtowych.
Prawdopodobnie bardziej prawdopodobne jest, że będziesz chciał wybrać konkretne zmiany
Więcej na temat zbierania wiśni na http://git-scm.com/docs/git-cherry-pick
źródło