Jakie są przykłady często używanych praktyk nazywania gałęzi git? [Zamknięte]

1120

Od kilku miesięcy korzystam z lokalnego repozytorium git współdziałającego z repozytorium CVS mojej grupy. Zrobiłem prawie neurotyczną liczbę gałęzi, z których większość na szczęście wróciła do mojego pnia. Ale nazewnictwo zaczyna być problemem. Jeśli mam zadanie, które można łatwo nazwać prostą etykietą, ale wykonuję je w trzech etapach, z których każdy obejmuje własną gałąź i sytuację scalania, to mogę powtórzyć nazwę gałęzi za każdym razem, ale historia jest nieco myląca. Jeśli otrzymam bardziej szczegółowe nazwy, z osobnym opisem dla każdego etapu, nazwy gałęzi zaczną być długie i nieporęczne.

Nauczyłem się, przeglądając tutaj stare wątki, że mogę zacząć nazywać gałęzie za pomocą / w nazwie, tj. Temat / zadanie lub coś w tym rodzaju. Mogę zacząć to robić i sprawdzać, czy to pomaga lepiej zorganizować sytuację.

Jakie są najlepsze praktyki nazywania gałęzi git?

Edycja: nikt tak naprawdę nie zaproponował żadnych konwencji nazewnictwa. Usuwam gałęzie, kiedy skończę z nimi. Po prostu zdarza mi się mieć kilka osób ze względu na to, że kierownictwo stale dostosowuje moje priorytety. :) Jako przykład tego, dlaczego mogę potrzebować więcej niż jednej gałęzi w zadaniu, załóżmy, że muszę przekazać pierwszy dyskretny kamień milowy w zadaniu do repozytorium CVS grupy. W tym momencie, z powodu mojej niedoskonałej interakcji z CVS, wykonałem to zatwierdzenie, a następnie zabiłem tę gałąź. (Widziałem zbyt wiele dziwności w interakcjach z CVS, jeśli w tym momencie próbuję nadal używać tej samej gałęzi).

skiphoppy
źródło
Tak - prawdopodobnie dobrze jest nie trzymać się ani nie pchać gałęzi, które nie są przydatne po ich zakończeniu. O ile nie ma dobrego powodu, aby prowadzić gałąź tematów (np. Skonsultować ją później), nie ma problemu z jej usunięciem. Git ułatwia rozgałęzianie, a następstwem jest to, że możesz skończyć z wieloma trywialnymi gałęziami leżącymi wokół, które można oczyścić bez zbędnych ceregieli.
Eric Walker,
14
Zobacz także github.com/agis-/git-style-guide
Agis
2
Dla kompletności istnieje kilka sekwencji znaków, których nie można użyć .
Nick Westgate,
18
W sieci StackExchange musi być miejsce na tego rodzaju pytania. Bardzo cholernie denerwujące, gdy ktoś zadaje takie pytanie, a następnie zostaje zamknięte za nieprzestrzeganie zasad. Jeśli nadal tak się dzieje, prawdopodobnie powinno to oznaczać potrzebę wsparcia tego rodzaju pytań. Tylko te prawdopodobnie musiałyby zostać zaimplementowane w witrynie przepełnienia, ponieważ są one tak ściśle związane z pytaniami typu programowania. Dla mnie przepełnienie nie dotyczy „obiektywnie możliwych odpowiedzi” (zbyt szczegółowych), to „pytania dotyczące programowania”.
Nick Res,
@Wim Używamy kluczy wydania Jira w połączeniu z krótkim tytułem, na przykład:KEY-1234/allow-users-to-do-smart-stuff
RobAu

Odpowiedzi:

937

Oto niektóre konwencje nazewnictwa gałęzi, których używam i ich uzasadnienie

Konwencje nazewnictwa oddziałów

  1. Użyj tokenów grupujących (słów) na początku nazw oddziałów.
  2. Zdefiniuj i używaj krótkich tokenów potencjalnych klientów, aby rozróżniać gałęzie w sposób istotny dla przepływu pracy.
  3. Użyj ukośników, aby oddzielić części nazw oddziałów.
  4. Nie używaj nagich liczb jako wiodących części.
  5. Unikaj długich opisowych nazw dla długowiecznych gałęzi.

Tokeny grupowe

Użyj tokenów „grupujących” przed nazwami swoich oddziałów.

group1/foo
group2/foo
group1/bar
group2/bar
group3/bar
group1/baz

Grupy można nazwać dowolnie, aby dopasować je do przepływu pracy. Lubię używać moich rzeczowników krótkich. Czytaj dalej dla większej przejrzystości.

Krótkie, dobrze zdefiniowane tokeny

Wybierz krótkie tokeny, aby nie dodawały zbyt wiele hałasu do każdej nazwy Twojej gałęzi. Używam tych:

wip       Works in progress; stuff I know won't be finished soon
feat      Feature I'm adding or expanding
bug       Bug fix or experiment
junk      Throwaway branch created to experiment

Każdy z tych tokenów może służyć do informowania, do której części przepływu pracy należy każda gałąź.

Wygląda na to, że masz wiele gałęzi dla różnych cykli zmiany. Nie wiem, jakie są twoje cykle, ale załóżmy, że są one „nowe”, „testowane” i „zweryfikowane”. Możesz nazwać swoje gałęzie skróconymi wersjami tych tagów, zawsze pisanymi w ten sam sposób, aby pogrupować je i przypomnieć, na jakim etapie jesteś.

new/frabnotz
new/foo
new/bar
test/foo
test/frabnotz
ver/foo

Możesz szybko stwierdzić, które gałęzie osiągnęły poszczególne etapy, i możesz je łatwo grupować, korzystając z opcji dopasowania wzorców Gita.

$ git branch --list "test/*"
test/foo
test/frabnotz

$ git branch --list "*/foo"
new/foo
test/foo
ver/foo

$ gitk --branches="*/foo"

Użyj ukośników, aby oddzielić części

Możesz używać większości dowolnych ograniczników w nazwach gałęzi, ale uważam, że ukośniki są najbardziej elastyczne. Wolisz używać myślników lub kropek. Ale ukośniki umożliwiają zmianę nazwy gałęzi podczas wypychania lub pobierania do / z pilota.

$ git push origin 'refs/heads/feature/*:refs/heads/phord/feat/*'
$ git push origin 'refs/heads/bug/*:refs/heads/review/bugfix/*'

Dla mnie ukośniki działają również lepiej dla rozwijania tabulatorów (wykonywania poleceń) w mojej powłoce. Sposób, w jaki go skonfigurowałem, pozwala wyszukiwać gałęzie z różnymi pod-częściami, wpisując pierwsze znaki części i naciskając klawisz TAB. Następnie Zsh podaje mi listę rozgałęzień pasujących do wpisanego przeze mnie tokena. Działa to zarówno z poprzednimi, jak i osadzonymi tokenami.

$ git checkout new<TAB>
Menu:  new/frabnotz   new/foo   new/bar


$ git checkout foo<TAB>
Menu:  new/foo   test/foo   ver/foo

(Zshell jest bardzo konfigurowalny pod względem wykonywania poleceń i mógłbym również skonfigurować go tak, aby obsługiwał myślniki, podkreślenia lub kropki w ten sam sposób. Ale nie chcę.)

Pozwala także wyszukiwać gałęzie w wielu poleceniach git, takich jak:

git branch --list "feature/*"
git log --graph --oneline --decorate --branches="feature/*" 
gitk --branches="feature/*" 

Zastrzeżenie: Jak Slipp wskazuje w komentarzach, ukośniki mogą powodować problemy. Ponieważ gałęzie są implementowane jako ścieżki, nie można mieć gałęzi o nazwie „foo” i innej gałęzi o nazwie „foo / bar”. Może to być mylące dla nowych użytkowników.

Nie używaj nagich liczb

Nie używaj nagich liczb (lub liczb szesnastkowych) jako części schematu nazewnictwa gałęzi. W rozszerzaniu tabulatora nazwy referencyjnej git może zdecydować, że liczba jest częścią sha-1 zamiast nazwy gałęzi. Na przykład mój moduł śledzenia problemów nazwał błędy liczbami dziesiętnymi. Nazywam moje powiązane gałęzie CRnnnnn, a nie tylko nnnnn, aby uniknąć zamieszania.

$ git checkout CR15032<TAB>
Menu:   fix/CR15032    test/CR15032

Gdybym próbował rozwinąć tylko 15032, git nie byłby pewien, czy chciałbym wyszukać SHA-1 lub nazwy gałęzi, a moje wybory byłyby nieco ograniczone.

Unikaj długich opisowych nazw

Długie nazwy gałęzi mogą być bardzo pomocne, gdy patrzysz na listę gałęzi. Ale może to przeszkadzać, gdy patrzy się na zdobione jednowierszowe kłody, ponieważ nazwy gałęzi mogą pochłonąć większość pojedynczej linii i skrócić widoczną część kłody.

Z drugiej strony długie nazwy gałęzi mogą być bardziej pomocne w „zatwierdzaniu scalania”, jeśli zwykle nie przepisujesz ich ręcznie. Domyślny komunikat zatwierdzenia scalania to Merge branch 'branch-name'. Przydatne może być wyświetlanie wiadomości scalania jako Merge branch 'fix/CR15032/crash-when-unformatted-disk-inserted'zamiast po prostu Merge branch 'fix/CR15032'.

phord
źródło
156
Jednym minusem korzystania z mieszanki form takich jak bug/20574/frabnotz-finderi bug/20424jest to, że kiedy zaczniesz bez sub-tokena, nie możesz dodać go później i odwrotnie. EG: Jeśli utworzysz bug/20424gałąź, nie możesz bug/20424/additional-fixingpóźniej utworzyć gałęzi (chyba że usuniesz bug/20424gałąź). Podobnie, jeśli bug/20574/frabnotz-finderjest to już gałąź, nie można utworzyć bug/20574gałęzi. W takich przypadkach (np. bug/20574_frabnotz-finder) Używam ogranicznika nie będącego subtokenem lub wybieram domyślną nazwę dla tego tokenu (np bug/20424/main.).
Slipp D. Thompson
5
Ma również tę zaletę, że zachęca niektóre narzędzia oparte na graficznym interfejsie Git do umożliwienia zwijania podziałów tokenów, takich jak widok listy katalogów. W powyższym przykładzie zobaczysz featuregrupę i buggrupę, które można rozwinąć, aby wyświetlić foo, bartagi dla pierwszej i a 20574, 20592grupy i 20424, 21334tagi dla drugiej.
Slipp D. Thompson
47
Zacznę kampanię, aby nigdy nie używać ukośników w nazwach gałęzi git. Powodem tego jest to, że jeśli na przykład w CI chcesz odwoływać się do nazwy oddziału podczas pakowania kodu, na przykład chcesz odwoływać się do nazwy oddziału podczas budowania URI lub PATH (na przykład), być może budowania URI w skrypcie bash; będziesz miał problemy z budowaniem URI z powodu ukośnika dodania części adresu URL. Tak, możliwe jest zastąpienie ukośnika, ale zajmie mi to dużo czasu.
Adam Spence,
13
Czy to problem, że w niektórych przypadkach ukośniki mają znaczenie dla git? Np. W odpowiedzi na git branch -ai otrzymywanie remotes/origin/masteritp. Kiedy widzę, że git mówi mi o gałęzi, nie używam ukośników do przodu, więc kiedy go widzę, wiem, że jest to „specjalne” odniesienie.
Dogweather
11
Czy możesz podać kilka przykładów zamiast foo i baru?
Worthy7
329

Udany model rozgałęziania Git autorstwa Vincenta Driessena ma dobre sugestie. Zdjęcie jest poniżej. Jeśli ten model rozgałęzień przemawia do ciebie, rozważ rozszerzenie przepływu do git . Inni komentowali przepływ

Model Driessena obejmuje

  • Gałąź główna, używana tylko do wydania. Typowa nazwa master.

  • Oddział „rozwijający się” z tego oddziału. To jest używane do większości prac na linii głównej. Powszechnie nazywane develop.

  • Wiele gałęzi funkcji poza gałęzią programowania. Nazwa oparta na nazwie funkcji. Zostaną one scalone z powrotem w develop, a nie w gałęzie master lub release.

  • Gałąź wydań, która przechowuje wersje dla kandydatów, zawierające tylko poprawki błędów i żadnych nowych funkcji. Typowa nazwa rc1.1.

Poprawki to krótkotrwałe gałęzie dla zmian, które pochodzą od wzorca i przejdą do wzorca bez udziału gałęzi programistycznej.

wprowadź opis zdjęcia tutaj

Brian Carlton
źródło
129
Tyle, że tak naprawdę nie rozwiązuje tego problemu, ponieważ pozostawia użytkownikowi wiele konwencji nazewnictwa, szczególnie dla gałęzi funkcji (mogą to być „wszystko oprócz master, develop, release lub hotfix-
Brian,
1
@Brian W czym pomoże konwencja nazewnictwa funkcji w kontekście problemów, które model rozwiązuje? Obecnie tak naprawdę nie rozumiem, jak dalsze rozróżnianie funkcji jest naprawdę pomocne. Może przyszłość vs następne wydanie, ale jest to do negocjacji i dlatego nie powinno być częścią nazwy. Aby zapewnić czytelność, może wystarczyłoby po prostu dodanie do nich funkcji *. Wstałeś kilka razy, więc jestem ciekawy twojego procesu myślowego ...
Nick Res,
2
Chociaż dobra informacja, ta odpowiedź dotyczy raczej kwestii przepływu niż konwencji nazewnictwa. Myślę, że OP chciałby wiedzieć, jakich rzeczywistych słów użyć (rzeczowniki vs. czasowniki), ograniczniki,
wielkość
6
Książka Continuous Delivery (s. 36) dowodzi, że ten model jest swego rodzaju antytesem dla Continuous Integration, ... w gruncie rzeczy nie jest tak naprawdę „zwinny”.
Markon
To tak naprawdę nie odpowiada na zadane pytanie. Daje to wgląd w integrację konkretnego przepływu pracy git z nadrzędnym harmonogramem rozwoju i wydania, jednak operacja szuka porady na temat konwencji dotyczących tego, co właściwie nazwać gałęziami.
kołodziej
56

Osobiście wolę usunąć nazwę gałęzi po zakończeniu pracy z gałęzią tematyczną.

Zamiast próbować użyć nazwy gałęzi do wyjaśnienia znaczenia gałęzi, zaczynam temat tematu komunikatu zatwierdzenia w pierwszym zatwierdzeniu w tej gałęzi słowem „Oddział:” i dołączam dalsze wyjaśnienia w treści wiadomości, jeśli temat nie daje mi wystarczająco dużo miejsca.

Nazwa mojej gałęzi jest czystym uchwytem do odwoływania się do gałęzi tematu podczas pracy nad nim. Po zakończeniu pracy nad gałęzią tematów pozbywam się nazwy gałęzi, czasami oznaczając zatwierdzenie do późniejszego wykorzystania.

To sprawia, że ​​dane wyjściowe są również git branchbardziej przydatne: zawiera tylko gałęzie długowieczne i aktywne gałęzie tematyczne, a nie wszystkie gałęzie.

Arystoteles Pagaltzis
źródło
53

Mieszałem i dopasowywałem z różnych schematów, które widziałem i opartych na oprzyrządowaniu, którego używam.
Więc moja ukończona nazwa oddziału to:

nazwa / funkcja / numer wydania / krótki opis

co przełożyłoby się na:

mike / blogs / RSSI-12 / logo-fix

Części są oddzielone ukośnikami, ponieważ są one interpretowane jako foldery w SourceTree w celu ułatwienia organizacji. Używamy Jira do śledzenia problemów, więc podanie numeru ułatwia wyszukiwanie w systemie. Uwzględnienie tego numeru umożliwia także jego wyszukiwanie podczas próby znalezienia tego problemu w Github podczas próby przesłania żądania ściągnięcia.

MikeG
źródło
Jestem taki sam, z wyjątkiem numeru błędu / funkcji w komunikacie zatwierdzenia (dla GitHub -> Integracja z Pivotal Tracker).
Leo
Zastanawiam się, co oznacza RSSI.
Renshuki
@renshuki to tylko ogólny klucz projektu Jira. Niezależnie od używanego narzędzia do śledzenia problemów, wprowadź identyfikator biletu
MikeG
@MikeG dziękuję za precyzję!
Renshuki
3
Używam tego samego, ale przekazuję numer wydania wraz z opisem:name/feature/issue-tracker-number-short-description
lephleg
22

Dlaczego dla każdego zadania potrzeba trzech oddziałów / scaleń? Czy możesz wyjaśnić więcej na ten temat?

Jeśli korzystasz z systemu śledzenia błędów, możesz użyć numeru błędu jako części nazwy oddziału. Dzięki temu nazwy gałęzi będą unikalne, a ty możesz poprzedzić je krótkim lub opisowym słowem lub dwoma, aby były czytelne dla ludzi "ResizeWindow-43523". Pomaga to także ułatwić czyszczenie oddziałów, ponieważ można wyszukać związany z nimi błąd. Tak zazwyczaj nazywam swoje oddziały.

Ponieważ te gałęzie ostatecznie łączą się z powrotem w master, powinieneś być bezpieczny, usuwając je po scaleniu. O ile się nie połączysz --squash, cała historia oddziału będzie istnieć, nawet jeśli kiedykolwiek będziesz jej potrzebować.

farktronix
źródło
12

Uwaga: jak pokazano w zatwierdzeniu e703d7 lub zatwierdzeniu b6c2a0d (marzec 2014 r.), Teraz stanowiącym część Git 2.0, znajdziesz inną konwencję nazewnictwa (którą możesz zastosować do gałęzi).

„Kiedy potrzebujesz użyć spacji, użyj myślnika” to dziwny sposób na powiedzenie, że nie możesz używać spacji.
Ponieważ w opisach wiersza poleceń bardziej powszechne jest używanie wielu przerywanych słów, nie chcesz nawet używać spacji w tych miejscach.

Nazwa oddziału nie może zawierać spacji (patrz „ Które znaki są nielegalne w nazwie oddziału? ” I na git check-ref-formatstronie man ).

Tak więc dla każdej nazwy gałęzi, która byłaby reprezentowana przez wyrażenie składające się z wielu słów, -dobrym pomysłem jest użycie „ ” (myślnika) jako separatora.

VonC
źródło
7

Zgodnie z sugestią farktronix, używamy numerów biletów Jira dla podobnych w merkurialu i planuję nadal używać ich do gałęzi git. Ale myślę, że sam numer biletu jest prawdopodobnie wystarczająco unikalny. Chociaż może być pomocne posiadanie opisowego słowa w nazwie gałęzi, jak zauważył farktronix, jeśli przełączasz się między gałęziami wystarczająco często, prawdopodobnie mniej chcesz pisać. Następnie, jeśli chcesz poznać nazwę oddziału, poszukaj w Jira powiązanych słów kluczowych w bilecie, jeśli go nie znasz. Ponadto w każdym komentarzu należy podać numer biletu.

Jeśli twoja gałąź reprezentuje wersję, wydaje się, że powszechną konwencją jest stosowanie formatu xxx (przykład: „1.0.0”) dla nazw gałęzi i vx.xx (przykład „v1.0.0”) dla nazw znaczników (aby uniknąć konfliktu) . Zobacz też: is-there-an-standard-naming-convention-for-git-tags

Gary S. Weaver
źródło
1
Czy występuje problem z konfliktami? Jeśli chodzi o to, v1.2.4aby gałąź ostatecznie doprowadziła do punktu końcowego z v1.2.4tagiem (czy mam rację zakładając, że jest to sytuacja, w której zarówno nazwy gałęzi, jak i tagów są nazywane po wersji) , to czy to ma znaczenie? Znacznik nadal jest osiągalny w, refs/tags/v1.2.4a gałąź w refs/heads/v1.2.4, i wygląda na to, że Git woli nazwę znacznika, gdy jest niejednoznaczny (z ostrzeżeniem).
Slipp D. Thompson
1
W przykładzie wersji, jak wspomniałem w mojej odpowiedzi, sugerowaną praktyką jest przedrostek „v” dla nazw znaczników, a nie rozgałęzień. Unikaj dwuznaczności, jeśli możesz uniknąć nieporozumień, a ponieważ może to spowodować problemy z migracją na drodze do następnej najnowszej i największej VCS.
Gary S. Weaver
2
Niedawno pracowałem z repozytorium, w którym ograniczono każdą gałąź wersji tagiem o tej samej nazwie. Działa to całkiem dobrze, ponieważ nie ma w tym nic niejednoznacznego (w większości przypadków znacznik wskazuje ostatni zatwierdzenie w odpowiedniej gałęzi), a kiedy może, Git „robi to, co należy” (z ostrzeżeniem). Wolę to, ponieważ jeśli ktoś popełni błąd z łbem kośćmi i podejmie dalszą decyzję w sprawie odgałęzionej gałęzi, Git będzie kontynuował wybieranie tagu, co jest intencją. Dwuznaczność może uprościć sytuację, gdy system ma wszystko pod kontrolą, a intencja jest jasna.
Slipp D. Thompson,