Kiedy jest właściwy moment na usunięcie gałęzi funkcji git?

88

Nie chcę skończyć z 82 gałęziami funkcji wiszącymi dookoła , więc zastanawiam się, jakie są potencjalne wady po prostu usuwania gałęzi funkcji, gdy tylko połączę ją z master.

Przepływ pracy:

git co -b feat-xyz
hack hack
git ci
hack some more
git ci
git co master
git merge feat-xyz
smoke test
git br -d feat-xyz

Jakieś problemy?

bstpierre
źródło
1
Powiedziałbym, że żadnych problemów, ponieważ jeśli naprawdę ich potrzebujesz, zawsze możesz później wskrzesić usuniętą gałąź.
slebetman
@slebetman O ile wiem, usuniętej gałęzi nie można wskrzesić. Jeśli jednak gałąź została w pełni scalona do mastera przed jej usunięciem, nie powinno już być potrzeby jej używania.
Simeon
1
@Simeon Tak, możesz. Git nigdy nie usuwa zatwierdzeń, więc kiedy usuwasz gałąź, po prostu usuwasz jej nazwę. Aby wskrzesić usuniętą gałąź, wystarczy pamiętać o ostatniej rzeczy, którą zobowiązałeś się do tej gałęzi i możesz ją wyszukać git reflog. Następnie
sprawdź
@slebetman, które będzie prawdziwe tylko wtedy, gdy gałąź zostanie ostatecznie scalona. jeśli zatwierdzenia zostaną pozostawione, w końcu staną się nieosiągalne i po pewnym czasie zostaną wyrzucone do pamięci. nawet wpisy w reflogu zostaną ostatecznie usunięte, domyślnie masz około 90 dni.
goldenratio
@goldenratio: Jakieś odniesienie do tego?
slebetman

Odpowiedzi:

61

Usuń po scaleniu to zwykły sposób. Dlatego git branch -d yourbranchnamesprawdza, czy gałąź jest w pełni scalona, ​​zanim zostanie usunięta.

Jest kilka powodów, dla których przychodzi mi do głowy, aby zachować gałąź dookoła: możesz chcieć ją zatrzymać na wypadek, gdyby pojawiły się błędy, które powracają po uruchomieniu produkcji, lub możesz chcieć mieć zapis historyczny.

W obu przypadkach możesz oznaczyć nagłówek gałęzi przed jej usunięciem. Tag jest jak gałąź, ponieważ jest wskaźnikiem do zatwierdzenia, z wyjątkiem kilku drobnych różnic: 1) porcelain zwykle nie wyświetla tagów w poleceniach eksploracyjnych, takich jak git show-branch lub tab-auto complete w kasie, 2) wybranie jednego z wyjść umieszcza cię w odłączonym (bez odniesienia) HEAD 3) możesz zostawić „ tagging message ”, co powoduje, że znacznik jest zapisywany jako obiekt w składnicy obiektów, podobnie jak zatwierdzenie.

W ten sposób zachowujesz historię, a jeśli kiedykolwiek zajdzie potrzeba naprawienia błędów, polecam po prostu utworzenie nowej gałęzi z mastera dla poprawki.

masonk
źródło
1
Wyrejestrowanie tagu ustawia HEAD, ale nie tworzy automatycznie gałęzi. HEAD na zatwierdzeniu bez gałęzi jest tym, co powoduje odłączenie.
Binarian,
1
Masz rację, ustawia HEAD na identyfikator zatwierdzenia, a nie ref. Ta część mojego OP jest nieprawidłowa. Powinienem to zaktualizować.
masonk
96

Usuwam po scaleniu, ale zawsze robię a git merge --no-ff, aby uniknąć szybkiego przewijania do przodu, aby historia gałęzi była widoczna na wykresie. Lubię mieć historię, w której gałąź fabularna odeszła od gałęzi deweloperskiej i gdzie dołączyła z powrotem:

Łączenie z szybkim przewijaniem lub bez niego

Jest to zaczerpnięte z udanego modelu rozgałęziania Git autorstwa Vincenta Driessena, bardzo przyjemnego przepływu pracy do użycia z git, który stosuję w większości moich projektów.

lkraider
źródło
To kolejny fajny sposób na zachowanie historii, ponieważ możesz wybrać zatwierdzenia, które są osiągalne z funkcji, ale nie z master: rev ^ 1..rev ^ 2. Wadą jest to, że skręca wszelkie zmiany bazy, które możesz chcieć zrobić z gałęzi głównej (np. Jeśli chcesz, aby master był ponownie bazowany na zdalnym urządzeniu nadrzędnym, co jest bardzo powszechne).
masonk
1
Nie miałem tego problemu. Nasz zespół synchronizuje się przez github i zwykle nie muszę zmieniać bazy, ale nie sądzę, że jest to wada. Nawet jeśli przebudujesz swoją gałąź develop i feature, to rozgałęzienie pozostaje widoczne na wykresie, a liczy się to, co jest w gałęzi feature w stosunku do developmentu, a nie zatwierdzenie, w którym odszedłeś, kiedy tworzyłeś tę gałąź.
lkraider
@Ikraider, dzięki za przypomnienie. Widziałem ten artykuł, kiedy po raz pierwszy uczyłem się gita, teraz ma dla mnie więcej sensu. Przebudowuję moje gałęzie funkcji, ale merge --no-ffwracam do mastera, ponieważ tak jak mówisz, możesz zobaczyć historię.
bstpierre
7

Przychodzą mi do głowy dwa powody, dla których warto przez chwilę zachować gałąź funkcji:

  • Jest szansa, że ​​zostanie odesłany z powrotem do Ciebie w celu uzyskania większej ilości pracy.
  • Inni programiści mogą chcieć tej funkcji, nie chcąc wszystkiego innego w głównym.

W praktyce w większości przypadków usuwanie po scaleniu jest w porządku.

Karl Bielefeldt
źródło
6

Typowy przepływ pracy to

 // Create new branch
 $ git checkout -b myfeature
 // and then do some changes and commit them

 // Switch to master branch
 $ git checkout master

 // Merge myfeature to master. --no-ff will always keep branch information.
 $ git merge --no-ff myfeature

 // Delete myfeature branch
 $ git branch -d myfeature

 // Push the changes
 $ git push origin master
Fizer Khan
źródło
1

Myślę, że to typowy przepływ pracy (usuwanie po scaleniu)

EDYTUJ Więc zamiast łączyć, przynajmniej w przypadku gałęzi o krótkim okresie życia, myślę, że chodzi o to, aby przenieść je na master. wtedy kończy się liniowa historia zmian, a cała gałąź staje się częścią głównego pnia. w tym przypadku masz wszystkie zmiany, więc najwyraźniej nie potrzebujesz kopii.

druga
źródło
Więc naprawdę nie ma sensu trzymać gałęzi w pobliżu, prawda?
bstpierre
1
Zdecydowanie zalecam unikanie „rebase”. Rebasing jest ogólnie szkodliwy, przydatny tylko w niektórych przypadkach.
Dietrich Epp
9
Rebasing to całkowicie rozsądny przepływ pracy dla lokalnych, prywatnych oddziałów. Bardzo często jest zsynchronizowany z pracą nadrzędną, na przykład poprzez zmianę bazy („ponowne bazowanie w dół ”). Zmiana bazy jest znacznie mniej powszechna i zwykle szkodliwa *. odpowiedź drugiej nie ma sensu, ponieważ bez względu na to, czy zmieniasz bazę, czy łączysz się z zewnętrznymi zmianami, nadal musisz w jakiś sposób podnosić te elementy. Nawet w lokalnym oddziale będziesz musiał w pewnym momencie scalić swoją funkcję, aby opanować ją. Zaletą pozostania w oparciu o swoje funkcje jest to, że to scalanie staje się szybkie do przodu.
masonk
1
Jest jednak coś, na co trzeba uważać przy odbudowywaniu gałęzi, co ostatnio mnie ugryzło. Teraz jest to oczywiste, ale spędziłem miesiące na długowiecznej gałęzi, zawsze przeciwstawiając się panu. Skończyło się na około 600 ładnych, ziarnistych zatwierdzeniach, ale mistrz był dziko refaktoryzowany i całkowicie zmieniany wiele razy. Za każdym razem zmieniając bazę całej gałęzi, odcinałem jej starsze zatwierdzenia od ich połączenia do zatwierdzeń głównych, które miały dla nich sens. Teraz zdecydowanie wolę scalać w master, gdy jest to potrzebne. Przebadam bazę tylko wtedy, gdy absolutnie nie będzie to miało wpływu na historię oddziału.
Gary Fixler