Kiedy usuwać oddziały w Git?

284

Załóżmy, że mamy aplikację, która jest stabilna.

Jutro ktoś zgłasza wielki błąd, który postanowiliśmy od razu naprawić. Dlatego tworzymy gałąź dla tej poprawki poza „master”, nazywamy ją „2011_Hotfix” i podnosimy ją, aby wszyscy programiści mogli współpracować przy jej naprawianiu.

Naprawiamy błąd i łączymy „2011_Hotfix” w „master”, a także w bieżącą gałąź programistyczną. I wciśnij „master”.

Co teraz robimy z „2011_Hotfix”? Czy powinien po prostu siedzieć tam jako gałąź do końca czasów, czy też powinniśmy go teraz usunąć, skoro spełnił swój cel? Wydaje się nieczyste pozostawianie gałęzi leżących wszędzie, ponieważ lista gałęzi prawdopodobnie stanie się bardzo długa, z których większość nie jest już nawet potrzebna.

W przypadku, gdy należy go usunąć, co stanie się z jego historią? Czy to zostanie utrzymane, nawet jeśli faktyczny oddział nie jest już dostępny? Ponadto, jak usunąć zdalną gałąź?

Anthony Compton
źródło
33
Często pomaga myśleć o oddziałach jak o pomysłach. Dość dobrą zasadą jest to, że jeśli skończysz pracować nad pomysłami reprezentowanymi przez gałąź - w tym wykonane testy i uwzględnienie tych zmian (scalenie ich w master) - skończysz z samą gałęzią.
Cascabel,
3
Co chciałbym wiedzieć: jeśli usuwana jest zdalna poprawka, czy zostanie ona usunięta lokalnie dla wszystkich współpracujących programistów? Jeśli nie; jak to osiągnąć? Sądzę, że jedna osoba migruje poprawkę do master, ale potem powinna ona zostać wyczyszczona również dla wszystkich współpracowników, aby zapobiec dodawaniu zatwierdzeń do tej gałęzi.
rolandow
1
Nie możesz wpływać na lokalne repozytoria komputerów współpracowników. Musisz albo powiedzieć mu, aby usunął gałąź lokalnie, albo możesz też wymusić tę stronę serwera za pomocą haków haczyków / zabezpieczeń gałęzi, aby zapobiec wypchnięciom z gałęzi, którą chcesz usunąć
srz2

Odpowiedzi:

183

Możesz bezpiecznie usunąć gałąź za pomocą git branch -d yourbranch. Jeśli zawiera nie połączone zmiany (tzn. Stracisz zatwierdzenia poprzez usunięcie gałęzi), git powie ci i nie usunie go.

Tak więc usunięcie połączonego oddziału jest tanie i nie spowoduje utraty historii.

Aby usunąć gałąź zdalną, użyj git push origin :mybranch, zakładając, że twoja nazwa zdalna jest początkowa, a gałąź zdalna, którą chcesz usunąć, nosi nazwę mybranch.

Artefakt 2
źródło
35
„usunięcie połączonego oddziału jest tanie”, ale tak samo jest. Nie ma znaczącego spadku wydajności pod względem czasu lub wykorzystania przestrzeni przez git, jeśli go trzymasz. Powiedziałbym, że usunę gałąź, ponieważ wszystkie zatwierdzenia są już w historii master, dzięki czemu wszystko staje się znacznie czystsze.
MatrixFrog,
22
Jednym z moich powodów, dla których chcę usunąć gałęzie, jest: Wprowadzamy wiele zmian w gałęziach (właściwie wszystkie zmiany), więc w końcu otrzymujesz długą listę przy użyciu polecenia „git branch”. Podsumowując, chcę skrócić tę listę. Stare gałęzie zostaną usunięte. Wydania Reale są oznaczone, więc nie są dla mnie przedmiotem dyskusji.
michel.iamit
7
Chociaż zgadzam się na usunięcie gałęzi, które już zostały scalone, jeśli chcesz zobaczyć listę gałęzi, które nie zostały scalone z bieżącą gałęzią, możesz użyć: git branch --no-
scaled
51
@MatrixFrog Jest tani w utrzymaniu, jeśli chodzi o git, jednak koszty ludzkie mogą stać się drogie. Właśnie rozpocząłem projekt z około 40 gałęziami, wszystkie z numerycznymi nazwami gałęzi. Nie mam pojęcia, co jest i prawie każda z tych gałęzi jest zestarzała. Narzut związany z przeszukiwaniem tych gałęzi i ustalaniem, co jest męczące i wymaga czasu. Tak, technicznie rzecz biorąc, jest tanie, ale tak naprawdę nie jest. Lubię zachować kształt mojego repozytorium git. Jeśli nie jest w aktywnym dev i został scalony, usuń go. Ale to tylko moja MO i szanuję, że inni mogą zrobić coś innego.
dudewad
1
Jakie polecenie ma ustawić --no-mergedwartość domyślną? Próbowałem git config --global --add branch.noMerged truei został dodany, ale to nie miało znaczenia.
Craig Silver,
55

To, co musisz zrobić, to oznaczyć wszystko, co wydasz. Trzymaj gałęzie, gdy aktywnie się rozwijasz.

Usuń stare gałęzie za pomocą

git branch -d branch_name

Usuń je z serwera za pomocą

git push origin --delete branch_name

lub stara składnia

git push origin :branch_name

co brzmi „wcisnąć nic do nazwy_gałęzi u źródła”.

To powiedziawszy, o ile DAG (ukierunkowany wykres acykliczny) może to wskazywać, zatwierdzenia będą istnieć w historii.

Google „git-flow”, który może dać więcej wglądu w zarządzanie wersjami, rozgałęzianie i tagowanie.

Adam Dymitruk
źródło
31

Ponieważ pytanie ma znacznik „github”, dodałbym to również: w szczególności w Github , jeśli ściągniesz żądanie gałęzi i zostanie ona scalona (albo przez interfejs użytkownika, albo przez połączenie gałęzi żądania ściągnięcia), nie będziesz stracisz dane żądania ściągnięcia (w tym komentarze), nawet jeśli usuniesz gałąź .

Konsekwencja tego: jeśli włączysz żądania ściągania jako część swojego przepływu pracy (który łączy się słodko z recenzjami kodu), możesz bezpiecznie usunąć gałęzie, gdy tylko zostaną scalone. Jest to tak powszechne, że ostatnio Github dodał (słodką) funkcję, która wyświetla przycisk „usuń gałąź” zaraz po scaleniu żądania ściągnięcia.

Warto jednak zauważyć, że każda grupa powinna przyjąć przepływ pracy, który najbardziej jej odpowiada (i może to prowadzić do usunięcia takich gałęzi). Mój obecny zespół roboczy, na przykład, przycina wszystkie gałęzie, które nie są związane z masterem lub wdrożeniem (np. Produkcja, przemieszczanie itp.), Gdy tylko ich żądania ściągnięcia zostaną scalone, a my nadal mamy pełne śledzenie tego, jak powstały powiązane zatwierdzenia każde przyrostowe ulepszenie każdego produktu.

Oczywiście żadne zarządzanie historią (żądania ściągania lub w inny sposób) nie zastępuje poprawnego oznaczania wersji (które najlepiej zautomatyzować za pomocą tego samego narzędzia / skryptu, który wdraża / pakuje wersję), więc zawsze możesz szybko przełączyć się na to, co akurat użytkownicy używają w danym momencie. Tagowanie jest również kluczem do rozwiązania pierwotnego problemu: jeśli ustalisz, że jakakolwiek gałąź scalona z gałęziami „roboczymi” może i powinna zostać usunięta, a każda, która jest scalona z tagiem wersji, „produkcyjnym” itp., Nie powinna , zawsze będziesz mieć żywe poprawki, dopóki nie zostaną zintegrowane w przyszłej wersji.

Chesterbr
źródło
2
Dziękujemy za wyjaśnienie, dlaczego Github pokazywał mi przycisk „Usuń gałąź”.
Todd Owen
Używamy sourcetree i daje to możliwość utrzymania lokalnego oddziału poprawki i zdalnego oddziału. Myślałem, że zamknięcie oddziału poprawki oznacza usunięcie go i nie można go ponownie użyć. np. Musimy wprowadzać poprawki codziennie przez następne 5 dni. Następnie go zamykamy. Ale powiedzmy, że szóstego dnia potrzebujemy kolejnej poprawki. Czy tworzymy nowy oddział poprawki?
Niebezpieczeństwo 14
Zwykle robią to ludzie. Jeśli indywidualne nazywanie ich jest niewykonalne, możesz nazwać je na podstawie dnia lub na podstawie odniesienia do systemu biletów, który nimi zarządza (jeśli taki istnieje). Oczywiście przepływy pracy git powinny być stosowane w oparciu o „to, co najlepiej pasuje do twojego zespołu”, więc nie martw się, jeśli zdecydujesz się na inną pracę.
chesterbr
7

Dodam, że wadą usuwania gałęzi jest to, że łamiesz wszelkie hiperłącza do tych gałęzi w GitHub (to pytanie jest oznaczone jako github). Pojawi się 404 Not Foundbłąd dla tych linków. Dlatego zmieniam moje linki, aby wskazywały na zatwierdzenie lub tag po usunięciu gałęzi w GitHub.

Ponieważ niektórych linków nie można zmienić, na przykład w wiadomości e-mail, teraz unikam całkowicie hiperłącza do gałęzi GitHub i od samego początku linkuję do zatwierdzenia lub tagu.

Wolę usuwać gałęzie po ich scaleniu. Zapobiega to wizualnemu bałaganowi długiej listy gałęzi w twoim repozytorium. Gałęzie te są również propagowane do wszystkich forków repozytorium.

Najpierw usuwam mój lokalny oddział. Zapobiega to przypadkowemu popchnięciu go później.

git branch -d branchName

Następnie usuwam gałąź zdalnego śledzenia

git branch -dr remoteName\branchName

Następnie usuwam gałąź na GitHub. Korzystam z interfejsu internetowego, ale równoważne polecenie znajduje się poniżej.

git push remoteName :branchName

Nawet jeśli gałąź nigdy nie zostanie scalona, ​​zazwyczaj nadal chciałbym zachować zatwierdzenia dla potomności. Nadal jednak chcę usunąć gałąź. Aby rozłożyć zatwierdzenia i zapobiec ich zjedzeniu przez śmieciarza, tworzę adnotację oznaczającą ten sam zatwierdzenie, co usunięta gałąź.

git tag -a tagName commitOrBranchName

Następnie przesuwam tag do github

git push remoteName tagName
Mark F. Guerra
źródło
Kiedy śmieciarz zjada zobowiązania oddziału? Czy musisz usunąć tag i wcisnąć tag przed usunięciem gałęzi?
Jared Thirsk,
4

Wygląda na to, że chcesz usunąć 2011_Hotfixgałąź bez utraty jej historii. Omówię najpierw usunięcie, a historię drugie.

Zwykłe gitmetody usuwania gałęzi zostały już opisane powyżej i działają zgodnie z oczekiwaniami. gitnie ma polecenia składającego się z jednego lub dwóch słów, co oznacza: „Hej git, usuń gałąź lokalną i zdalną”. Ale to zachowanie można naśladować za pomocą skryptu powłoki. Weźmy na przykład skrypt powłoki Zach Holmana „git-nuke” . To bardzo proste:

#!/bin/sh
git branch -D $1
git push origin :$1

Umieść to w pliku wykonywalnym (np. git-nuke) W jednym z $PATHkatalogów. Jeśli nie jesteś w 2011_Hotfixoddziale, po prostu uruchomienie git-nuke 2011_Hotfixusunie zarówno oddziały lokalne, jak i zdalne. Jest to o wiele szybsze i prostsze - choć być może bardziej niebezpieczne - niż standardowegit polecenia.

Twoja troska o zachowanie historii jest dobra. W takim przypadku nie musisz się martwić. Po scaleniu 2011_Hotfixna masterwszystkie rewizje od 2011_Hotfixzostaną dodane do master„s popełnić historię. Krótko mówiąc, nie stracisz historii po zwykłym połączeniu.

Chciałbym dodać jeszcze jedno słowo, które być może wykracza poza zakres twojego pytania, ale jest jednak istotne. Wyobraźmy sobie, że istnieje 20 drobnych „prac w toku” 2011_Hotfix; chcesz 2011_Hotfixjednak dodać tylko jedno pełne zatwierdzenie do masterhistorii. Jak połączyć wszystkie 20 małych zatwierdzeń w jeden duży zatwierdzenie? Na szczęście gitumożliwia konsolidację wielu zatwierdzeń w jednym zatwierdzeniu za pomocą git-rebase. Nie wyjaśnię tutaj, jak to działa; jednak jeśli jesteś zainteresowany, dokumentacjagit-rebase jest doskonała. Zwróć uwagę, że git rebaseprzepisuje historię, więc powinna być używana rozsądnie, zwłaszcza jeśli dopiero zaczynasz. Wreszcie, twój 2011_Hotfixscenariusz dotyczy zespołu deweloperów, a nie solistów. Jeśli używają członkowie zespołu projektowegogit rebase, mądrze jest, aby zespół miał wyraźne wytyczne dotyczące użytkowania git rebase, aby jakiś kowbojski twórca w zespole nieświadomie zniszczył githistorię projektu.

jfmercer
źródło
3

Jeśli został pomyślnie scalony z powrotem, a może nawet oznaczony, powiedziałbym, że nie ma już sensu. Możesz więc bezpiecznie zrobić git branch -d branchname.

Michael Fürstenberg
źródło
2

Jeśli chcesz przycinać lokalne oddziały, które zostały usunięte z pochodzenia, możesz również przycinać podczas używania git fetch

git fetch --prune
huch
źródło
0

Możesz usuwać gałęzie we wszystkich głównych internetowych interfejsach użytkownika, takich jak github, BitBucket. Po usunięciu oddziału online możesz usunąć oddział lokalny za pomocą

git remote prune origin
tkruse
źródło