Jakie modele rozgałęziające Git działają dla Ciebie?
Nasza firma korzysta obecnie z prostego modelu rozgałęzień trunk/release/hotfixes i prosi o poradę, które modele rozgałęzień najlepiej sprawdzają się w Twojej firmie lub procesie rozwoju.
-
Przepływy pracy / modele rozgałęziające
Poniżej są trzy główne opisy tego, co widziałem, ale są one częściowo sprzeczne ze sobą lub nie idą wystarczająco daleko, aby uporządkować kolejne problemy, które napotkaliśmy (jak opisano poniżej). Tak więc nasz zespół do tej pory domyślnie nie świetne rozwiązania. Robisz coś lepszego?
-
Scalanie vs rebasing (tangled vs sequential history)
Czy jeden
pull --rebase
czy poczekać z połączeniem z powrotem do linii głównej, aż zadanie zostanie ukończone? Osobiście skłaniam się ku połączeniu, ponieważ zachowuje to wizualny ilustracja na jakiej podstawie zadanie zostało rozpoczęte i ukończone, a ja nawet wolęmerge --no-ff
do tego celu. Ma jednak inne wady. Wiele osób nie zdaje sobie sprawy z przydatnej właściwości scalania - że nie jest to komutatywne (scalanie gałęzi tematycznej do master nie oznacza scalania gałęzi tematycznej do gałęzi tematycznej). -
Szukam naturalnego workflow
Czasami zdarzają się błędy, ponieważ nasze procedury nie uchwycą konkretnej sytuacji z proste zasady. Na przykład poprawka potrzebna dla wcześniejszych wydań powinna być oczywiście oparta na tyle downstream, aby możliwe było łączenie upstream we wszystkie niezbędne gałęzie (czy użycie tych terminów jest wystarczająco jasne?). Jednak zdarza się, że poprawka sprawia, że do master zanim deweloper zda sobie sprawę, że powinien być umieszczony dalej w dół, a jeśli to jest już popchnięte (co gorsza, scalone lub coś w oparciu o to), to opcja pozostała jest cherry-picking, z powiązanymi niebezpieczeństwami. Jakich prostych zasad używasz? obejmuje to również niezręczność jednej gałęzi tematycznej, koniecznie wykluczając inne gałęzie tematyczne (zakładając, że są rozgałęzione ze wspólnej linii bazowej). Programiści nie chcą kończyć funkcji, aby rozpocząć kolejną, czując, że kod, który napisali, już nie istnieje
-
Jak uniknąć konfliktów scalania (z powodu cherry-pick)?
To, co wydaje się być pewnym sposobem na stworzenie konfliktu scalania, to cherry-pick między gałęziami, nigdy nie mogą być połączone ponownie? Czy zastosowanie tego samego commita w rewert (jak to zrobić?) w którejś z gałęzi ewentualnie rozwiązać tę sytuację? Jest to jeden z powodów, dla których nie odważę się naciskać na przepływ pracy oparty w dużej mierze na scalaniu.
-
Jak rozłożyć się na gałęzie?
Zdajemy sobie sprawę, że świetnie byłoby zmontować gotową integrację z gałęzi tematycznych, ale często praca naszych programistów nie jest jasno określona (czasami jako proste jak "szturchanie") i jeśli jakiś kod już wszedł w temat" Różne", nie można go stamtąd ponownie wyciągnąć, zgodnie z powyższym pytaniem? Jak pracować z definiowaniem/zatwierdzaniem/kończeniem / uwalnianiem gałęzi tematycznych?
-
Odpowiednie procedury, takie jak przegląd kodu i ukończenie szkoły , byłyby oczywiście wspaniałe.
Ale po prostu nie możemy utrzymać rzeczy rozplątane na tyle, aby zarządzać tym - jakieś sugestie? oddziały integracyjne, ilustracje?
Poniżej znajduje się lista powiązanych pytań:
- jakie są dobre strategie, aby wdrożone aplikacje mogły być hotfixable?
- Opis przepływu pracy dla użycia Git dla wewnętrznego rozwoju
- Git workflow for corporate Linux Kernel development
- jak zachować kod rozwoju i Kod produkcji? (thanks forthis PDF!)
- wydania git zarządzanie
- Git Cherry-pick vs Merge Workflow
- jak wybrać wiele commitów
- jak połączyć pliki selektywne z git-merge?
- jak wybrać zakres commitów i scalić do innej gałęzi
- ReinH Git Workflow
- git workflow do tworzenia modyfikacji, których nigdy nie cofniesz do origin
- wiśnia-wybierz a merge
- prawidłowy przepływ pracy Git dla połączonego systemu operacyjnego i kodu prywatnego?
- utrzymanie projektu za pomocą Git
- dlaczego Git nie może scalić pliku ze zmodyfikowanym rodzicem / wzorcem.
- Git rozgałęzianie / rebasing dobre praktyki
- kiedy "git pull -- rebase" wpędzi mnie w kłopoty?
- w jaki sposób DVC są wykorzystywane w dużych zespołach?
Zobacz też co pisze Plastic SCM na task driven development , a jeśli Plastic nie jest twoim wyborem, przestudiuj model rozgałęziający nvie i jego wspierające Skrypty.
4 answers
Najbardziej niepokojącą cechą nowych programistów do DVC jest proces publikacji :
- możesz importować (pobierać/ściągać) cokolwiek zdalnego repo potrzebujesz Możesz opublikować (push) do dowolnego (nagiego) repo, które chcesz
- tylko rebase gałąź, jeśli nie została wypchnięta (nie wypchnięta od ostatniej rebazy)
- tylko push to a bare repo (obowiązkowe od Git1.7)
- wykonaj Rady Linusa dotyczące rebase i łączenia
Teraz:
Przepływy pracy / modele rozgałęzień :
Każdy obieg pracy ma za zadanie wspierać proces zarządzania wydaniami , który jest dostosowany do każdego projektu.
Co mogę dodać do przepływu pracy, o którym wspominasz, to: każdy deweloper nie powinien tworzyć gałęzi feature, tylko" current dev", ponieważ prawda jest taka: deweloper często nie wie, co dokładnie jego/jej gałąź będzie produce: jedna funkcja, kilka (ponieważ skończyło się na zbyt złożonej funkcji), Żadna (ponieważ nie jest gotowa na czas wydania), inna funkcja (ponieważ oryginalna miała "morfed"),...
Tylko " integrator "powinien tworzyć oficjalne gałęzie funkcji na" centralnym " repo, które mogą być następnie pobierane przez programistów, aby zmienić/scalić część ich pracy, która pasuje do tej funkcji.
Scalanie vs rebasing (historia splątana vs Sekwencyjna):
I like my answer you mention ("Opis przepływu pracy dla użycia git dla wewnętrznego rozwoju")
Szukam naturalnego workflow :
W przypadku poprawek, może pomóc powiązać każdą poprawkę z paragonem ze śledzenia błędów, co pomaga deweloperowi pamiętać, gdzie (tj. na której gałęzi, tj. dedykowanej gałęzi "dla poprawek") powinien wprowadzić takie modyfikacje.
Następnie Hooki mogą pomóc chronić centralny repo przed wypchnięciami z niezatwierdzonych poprawek błędów lub z gałęzi, z których nie należy pchać. (nie ma tu konkretnego rozwiązania, wszystko to musi być dostosowane do Twojego środowiska)
Jak uniknąć konfliktów scalania (z powodu cherry-pick)?
Jak stwierdził Jakub Narębski w swojej odpowiedzi , cherry-picking powinien być zarezerwowany dla rzadkich sytuacji, w których jest to wymagane.
Jeśli Twoja konfiguracja wymaga dużo cherry-picking (tj. "to nie jest rzadkie"), to coś jest nie tak.
Zastosowałby ten sam commit w revert (jak żeby to zrobić?)
git revert
powinno się tym zająć, ale to nie jest idealne.
Jak rozkładać się na gałęzie?
Tak długo, jak gałąź nie została jeszcze wszędzie wypchnięta, deweloper powinien zreorganizować swoją historię commitów (gdy w końcu zobaczy, że rozwój przybiera bardziej definitywny i stabilny kształt) na:
- kilka gałęzi w razie potrzeby (jeden przez wyraźną zidentyfikowaną cechę)
- spójny zbiór commitów w obrębie jednej gałęzi (patrz przycinanie gitar)
Odpowiednie procedury, takie jak przegląd kodu i ukończenie szkoły ?
Oddziały integracyjne (w dedykowanej integracji) repo może pomóc programistom w:
- rebase jego/jej rozwój na szczycie tej zdalnej gałęzi integracji (pull --rebase)
- rozwiąż lokalnie
- popchnij rozwój do tego repo
- sprawdź z integratorem, który nie powoduje bałaganu;)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:25:30
Myślę, i mogę się mylić, że jedną z rzeczy, które są najbardziej niezrozumiane w git jest jego rozproszona natura. To sprawia, że bardzo różnie można powiedzieć subversion w sposób, w jaki można pracować, chociaż można naśladować zachowanie SVN, jeśli chcesz. Problemem jest prawie każdy przepływ pracy, który jest świetny, ale także wprowadzający w błąd.
Jeśli dobrze rozumiem rozwój jądra (na tym się skupię), każdy ma własne repozytorium git do tworzenia jądra. Tam jest jednym repozytorium, linux-2.6.git, pod opieką Torvaldsa, który działa jako repozytorium release. Ludzie klonują się stąd, jeśli chcą zacząć rozwijać funkcję przeciwko gałęzi "release".
Inne repozytoria rozwijają się. Chodzi o to, aby klonować z linuksa-2.6, rozgałęziać się tyle razy, ile chcesz, aż do momentu, w którym masz działającą" nową " funkcję. Następnie, gdy będzie to gotowe, możesz udostępnić go komuś, kto uważa się za zaufanego, który wyciągnie tę gałąź z twojego repozytorium do ich i połączyć go z głównym nurtem. W jądrze Linuksa dzieje się to na kilku poziomach (zaufanych), aż dotrze do linuksa-2.6.git w tym momencie staje się"jądrem".
Teraz tutaj robi się mylące. Nazwy gałęzi w ogóle nie muszą być spójne w repozytoriach. Więc mogę {[0] } i uzyskać gałąź z master origin
w gałęzi w moim repozytorium o nazwie vanilla-code
. Pod warunkiem, że wiem o co chodzi, to naprawdę nie ma znaczenia - jest rozprowadzany w tym sensie, że wszystkie repozytoria są rówieśnikami, a nie tylko współdzielonymi między kilkoma komputerami, takimi jak SVN.
- myślę, że to od każdego programisty zależy, jak robią swoje rozgałęzienia. Wszystko czego potrzebujesz to centralne repozytorium do zarządzania wydaniami itp. Bagażnik może być
head
. Wydania mogą być tagami lub gałęziami, a poprawki są prawdopodobnie gałęziami same w sobie. W zasadzie, prawdopodobnie zrobiłbym wydania jako gałęzie, żebyś mógł dalej łatać oni. - połączyłbym, a nie rebase. Jeśli na przykład weźmiesz repozytorium, sklonujesz je, rozgałęzisz i wykonasz jakiś dev, następnie ściągnij ze swojego
origin
powinieneś w swoim repozytorium prawdopodobnie utworzyć inną gałąź i scalić najnowsząmaster
doyourbranch
, aby ktoś inny mógł ściągnąć twoje zmiany przy jak najmniejszym wysiłku. Z mojego doświadczenia wynika, że bardzo rzadko istnieje potrzeba prawdziwie rebase. - myślę, że jest to przypadek zrozumienia sposobu działania Gita i tego, co potrafi. To trochę trwa i dużo dobrej komunikacji - naprawdę zacząłem rozumieć, co się dzieje, kiedy zacząłem używać Gita z innymi programistami i nawet teraz, niektórych rzeczy nie jestem pewien.
- konflikty scalające są przydatne. Wiem, wiem, chcesz, żeby wszystko działało, ale faktem jest, że kod zmienia się i musisz połączyć wyniki w coś, co działa. Konflikty scalające to w rzeczywistości tylko więcej programowania. Nigdy nie znalazłem łatwego wyjaśnienia, co z nimi zrobić, więc oto jest: zwróć uwagę na pliki, które mieć konflikty scalania, przejść i zmienić je na to, co powinno być,
git add .
a następniegit commit
. - jakkolwiek to pasuje. Jak już powiedziałem, każdy użytkownik repozytorium git jest do zabawy i nazwy gałęzi nie muszą być takie same . Jeśli na przykład masz repozytorium pośredniczące, możesz wymusić schemat nazewnictwa, ale nie musisz tego robić dla każdego dewelopera, tylko w repo wydania.
- to jest etap połączenia. Scala się do gałęzi release itp. tylko wtedy, gdy uznasz kod za sprawdzone / przechodzą testy jakości.
Edytuj kilka dalszych przemyśleń na temat tego, jak używać git w komercyjnym środowisku, ponieważ wydaje się to istotne dla OP z komentarzy:
- repozytorium wersji, nazwiemy je
product.git
, jest dostępne dla wielu starszych programistów / osób technicznych odpowiedzialnych za opiekę nad samym produktem. Oni są analogiczne do roli opiekunów w OSS. - Ci Programiści prawdopodobnie również częściowo prowadzą rozwój nowych wersji, więc mogą również samodzielnie kodować i utrzymywać repozytoria varios. Mogą zarządzać repozytoriami przejściowymi dla naprawdę nowych funkcji, a także mogą mieć własne repozytoria.
- Poniżej znajdują się Programiści odpowiedzialni za tworzenie poszczególnych bitów. Na przykład ktoś może być odpowiedzialny za działanie interfejsu użytkownika. W związku z tym zarządzają interfejsem użytkownika.git repozytorium.
- Poniżej znajdują się prawdziwi programiści, którzy rozwijają funkcje jako swoją codzienną pracę.
latest-ui
, więc robi to git checkout latest-ui
, a następnie git merge abc-ui-mywhizzynewfeature
. Następnie mówi jego techniczny ołowiu (UI lead) Hej, wykonałem takie zadanie, wyciągnąć ode mnie. Tak prowadzi UI git pull user-repo lastest-ui:lastest-ui-suchafeature-abc
. UI lead następnie spojrzy na to na tej gałęzi i mówi, właściwie, to bardzo dobrze, połączę to w ui-latest
. Może wtedy powiedzieć wszystkim pod nim, aby wyciągnęli z niego swoje gałęzie lub jakiekolwiek imię, które im nadali, a więc funkcja zostanie zbadana przez deweloperów. Jeśli zespół jest zadowolony, prowadzący interfejs użytkownika może poprosić prowadzącego testy, aby wyciągnął z niego i połączył zmiany. To propaguje się do wszystkich (poniżej zmiany), którzy testują go i przesyła raporty o błędach itp. Wreszcie, jeśli funkcja przejdzie testowanie itp, jeden z najlepszych potencjalnych klientów technicznych może połączyć go z bieżącą roboczą kopią programu, w którym to momencie wszystkie zmiany są następnie propagowane z powrotem w dół. I tak dalej.
Nie jest to "tradycyjny" sposób pracy i jest zaprojektowany tak, aby był "peer driven", a nie "hierarchiczny", jak SVN/CVs. Zasadniczo każdy ma dostęp do commitów, ale tylko lokalnie. To dostęp do repozytorium i to, które repozytorium wyznaczasz jako release repo, pozwala na użycie hierarchii.
Model, który wykorzystałem z dobrymi wynikami jest następujący:
"błogosławiony" repo każdy pcha i ciągnie do/Z, W zasadzie topologia klient-serwer.
Nie ma gałęzi master, więc żaden programista nie może wcisnąć żadnego kodu do"mainline".
Wszystkie zmiany dzieją się na gałęziach tematycznych. Mamy nazwy przestrzeni nazw, aby łatwo wykryć, kto jest za to odpowiedzialny: jn / newFeature lub jn/issue-1234
Istnieje również blisko 1-to-1 mapowanie między gałęziami i kanban / karty scrum na tablica.
Aby zwolnić gałąź jest pchany do Błogosławionego repo i kanban-karta jest przenoszona do ready do przeglądu.
Wtedy, jeśli branch zostanie zaakceptowany przez przegląd, jest kandydatem do wydania.
Wydanie ma miejsce, gdy zestaw zaakceptowanych gałęzi zostanie scalony i oznaczony numerem wersji.
Poprzez wciśnięcie nowego tagu do the blessed repo istnieje nowa możliwa baza nowych funkcji.
Aby uniknąć konfliktów scalania programiści są uprzejmi poproszono o aktualizację (scalenie) niepublikowanych gałęzi do tagu najnowszego wydania.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-05 22:39:08
Osobiście staram się zachować tylko kod release-ready w gałęzi master.
Gdy pracuję nad nową funkcją lub poprawką błędów, robię to w gałęzi. Testuję również jednostki w oddziale. Jeśli wszystko działa OK, tylko wtedy mogę połączyć / rebase z powrotem do master.
Staram się również używać wspólnych konwencji nazewnictwa gałęzi, takich jak:
- bugfix / recursive_loop
- bugfix / sql_timeout
- feature / new_layout
- feature / enhanced_search
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-05 22:36:43