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.

  1. 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?

  2. 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).

  3. 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

  4. 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.

  5. 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?

  6. 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ń:

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.

Author: Community, 2010-04-12

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
Dzięki temu możesz przestrzegać kilku zasad, aby Twoje pytania były łatwiejsze:]}

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;)
 85
Author: VonC,
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.

Tak więc, mając to wszystko na uwadze:]}
  1. 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.
  2. 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 do yourbranch, 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.
  3. 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.
  4. 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ępnie git commit.
  5. 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.
  6. to jest etap połączenia. Scala się do gałęzi release itp. tylko wtedy, gdy uznasz kod za sprawdzone / przechodzą testy jakości.
Mam nadzieję, że to pomoże. Zdaję sobie sprawę, że VonC właśnie zamieścił bardzo podobne Wyjaśnienie... Nie umiem pisać wystarczająco szybko!

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ę.
Więc co się dzieje? Cóż, każdy wyciąga na początku każdego dnia ze źródła "upstream" tj. repozytorium release (które prawdopodobnie będzie również zawierać najnowsze materiały z poprzednich dni rozwoju). Każdy to robi, bezpośrednio. To trafi na gałąź w ich repozytorium, prawdopodobnie o nazwie "master", a może jeśli jesteś mną o nazwie "latest". Na programista wykona wtedy pewną pracę. Ta praca może być czymś, czego nie są pewni, więc tworzą gałąź, wykonują pracę. Jeśli to nie zadziała, mogą usunąć gałąź i wrócić. Jeśli tak się stanie, będą musieli połączyć się z główną gałęzią, nad którą aktualnie pracują. Powiedzmy, że jest to programista UI pracujący nad 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.

 21
Author: ,
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
2010-04-12 13:28:28

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.

 9
Author: John Nilsson,
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
 2
Author: xero,
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