Mam wiele oddziałów Git. Jak usunąć oddziały, które już zostały scalone? Czy istnieje prosty sposób na usunięcie ich wszystkich zamiast usuwania ich pojedynczo?
git
github
version-control
branch
feature-branch
Nyambaa
źródło
źródło
git branch -D
usuwa każdą gałąź, niezależnie od tego, czy jest scalona czy nie.master
każda gałąź. Jednak twój lokalny klient nadal będzie wyświetlał listę starych oddziałów, jeśli uruchomiszgit branch -a
; użyj,git fetch --prune
aby je usunąć (zgodnie z tą odpowiedzią ).git delete-merged --doit origin
lubgit delete-merged --doit --local
rm -fr work && git clone http://example.com/work.git
z biegiem lat stał się najłatwiejszym sposobem na wyjście z marynaty za pomocą git.Odpowiedzi:
AKTUALIZACJA:
Możesz dodać inne gałęzie, aby wykluczyć takie jak master i dev, jeśli Twój przepływ pracy ma je jako możliwy przodek. Zwykle rozgałęziam się od znacznika „sprint-start” i master, dev i qa nie są przodkami.
Najpierw wypisz wszystkie gałęzie, które zostały scalone zdalnie.
Możesz zobaczyć kilka gałęzi, których nie chcesz usunąć. możemy dodać kilka argumentów, aby pominąć ważne gałęzie, których nie chcemy usuwać, jak master lub develop. Następujące polecenie pominie gałąź master i wszystko, co ma w niej dev.
Jeśli chcesz pominąć, możesz dodać go do polecenia egrep w następujący sposób. Oddział
skip_branch_name
nie zostanie usunięty.Aby usunąć wszystkie lokalne oddziały, które są już połączone w aktualnie wyewidencjonowany oddział:
Możesz zobaczyć, że mistrz i dev są wykluczeni, jeśli są przodkami.
Możesz usunąć scalony oddział lokalny za pomocą:
Jeśli nie jest scalony, użyj:
Aby usunąć go ze zdalnego użycia:
Po usunięciu gałęzi ze zdalnego możesz przycinać, aby pozbyć się gałęzi zdalnego śledzenia za pomocą:
lub przycinaj poszczególne gałęzie zdalnego śledzenia, jak sugeruje druga odpowiedź, za pomocą:
Mam nadzieję że to pomoże.
źródło
git branch --merged | %{$_.trim()} | ?{$_ -notmatch 'develop' -and $_ -notmatch 'master'} | %{git branch -d $_}
fatal: branch name required
jeśli nie masz gałęzi, które należy usunąć. Aby tego uniknąć, możesz przekazać,-r
abyxargs
nie działał,git branch -d
jeśli standardowe wejście jest puste. (To rozszerzenie GNU xargs, zgodnie ze stroną man).Aby usunąć wszystkie gałęzie na pilocie, które są już scalone:
W nowszych wersjach Git
AKTUALIZACJA (autor @oliver; ponieważ nie mieści się w komentarzu, ale wystarczająca liczba odpowiedzi) : jeśli jesteś na gałęzi ABC, to ABC pojawi się w wynikach,
git branch -r --merged
ponieważ gałąź nie jest określona, więc gałąź domyślnie przyjmuje gałąź bieżącą i gałąź zawsze kwalifikuje się jako scalony z samym sobą (ponieważ nie ma różnic między gałęzią a sobą!).Więc albo określ gałąź:
LUB pierwszy główny kasjer:
źródło
dev
więc musiałem to zmienić| grep origin
po,grep -v master
aby zapobiec wypychaniu gałęzi innych pilotów do źródła.git branch -r --merged | grep -v master | grep origin | sed 's/origin\//:/' | xargs -n 1 echo
develop
gałąź.git branch -r --merged | grep -v master | grep -v develop | sed 's/origin\///' | xargs -n 1 git push --delete origin
. Teraz okazało się, że to mój pseudonim.-r
argument, o którym nigdzie indziej nie wspominałem. Jest rzeczą oczywistą, że tylko lokalne oddziały są warte sprzątania. Ale piloty też są pełne śmieci.myFeatureBranch
niej, to wyczyściszorigin/myFeatureBranch
. Prawdopodobnie najlepiejgit checkout master
najpierw.Po prostu rozszerzając nieco odpowiedź Adama:
Dodaj to do konfiguracji Gita, uruchamiając
git config -e --global
A następnie możesz usunąć wszystkie lokalne połączone gałęzie w prosty sposób
git cleanup
.źródło
git branch --merged master
skoro chcesz spojrzeć na to, co zostało scalone w master, aktualnie nie sprawdzoną gałąź?develop
lubdev
w takim przypadku komenda nie powiedzie sięfatal: malformed object name
, że lepiej jest mieć ogólne polecenia i masz obowiązek go uruchomić-r
doxargs
zapobiegnie niepotrzebnym błędom (branch name required
) podczas wielokrotnego uruchamiania tego aliasu lub gdy nie ma już gałęzi do usunięcia. Mój pseudonim wygląda następująco:cleanup = "!git branch --merged | grep -v -P '^\\*|master|develop' | xargs -n1 -r git branch -d"
Działa to również w celu usunięcia wszystkich scalonych gałęzi oprócz master.
źródło
master
. Spróbujgrep -v ^master$
na środku.| grep -v '^\*'
uniknąć usuwania bieżącej gałęzi, jeśli nie jesteś na mastergrep -v '^ master$'
. Jeśli wpiszesz go w sobie i przegapisz, usuniesz go,master
jeśli go nie ma.git branch
wyświetli nazwę każdej gałęzi w nowym wierszu z dwiema spacjami po lewej, jeśli nie jest to gałąź aktualnie wypisana. Zasadniczo masz gwarancję, że każdy, kto uruchomi to polecenie, usunie swoją gałąź główną, chyba że jest to gałąź aktualnie wypisana.Będziesz chciał wykluczyć gałęzie
master
idevelop
z tych poleceń.Lokalny git wyczyść:
Zdalne git wyczyść:
Synchronizuj lokalny rejestr zdalnych oddziałów:
źródło
git config --global --add fetch.prune true
przycinać automatycznie przy pobieraniu lub ciągnięciu.git branch -r --merged | grep -v '\*\|master\|develop' | grep '^\s*origin/' | sed 's/origin\///' | tr "\n" " " | xargs git push --delete origin
Dla tych z was, którzy są w systemie Windows i wolą skrypty PowerShell, oto jeden, który usuwa lokalne połączone gałęzie:
źródło
git branch --merged | ?{-not ($_ -like "*master")} | %{git branch -d $_.trim()}
for /f "usebackq" %B in (``git branch --merged^|findstr /v /c:"* " /c:"master"``) do @git branch -d %B
(westchnij, zamień podwójne cudzysłowy na pojedynczy, nie jestem pewien, jak sformatować literał zawierający cudzysłowy)Od lat korzystam z odpowiedzi Adama. To powiedziawszy, że są przypadki, w których nie zachowuje się tak, jak się spodziewałem:
Adresy 1 i 2 były łatwe do rozwiązania, z jedynie zmianą wyrażenia regularnego. 3 zależy od kontekstu tego, co chcesz (tj. Usuń tylko te gałęzie, które nie zostały połączone w master lub w stosunku do twojego obecnego oddziału). 4 może być katastrofalne (choć możliwe do odzyskania
git reflog
), jeśli przypadkowo uruchomisz to w stanie odłączonej GŁOWICY.Wreszcie chciałem, aby wszystko było w jednym wierszu, który nie wymagał osobnego skryptu (Bash | Ruby | Python).
TL; DR
Utwórz alias git „Sweep”, który akceptuje opcjonalną
-f
flagę:i wywołać go za pomocą:
lub:
Długa, szczegółowa odpowiedź
Najłatwiej było mi utworzyć przykładowe repozytorium git z niektórymi gałęziami i zobowiązuje się do przetestowania poprawnego zachowania:
Utwórz nowe repozytorium git za pomocą jednego zatwierdzenia
Utwórz nowe oddziały
Pożądane zachowanie: wybierz wszystkie połączone gałęzie z wyjątkiem: master, develop lub current
Oryginalne wyrażenie regularne brakuje gałęzi „mistrzowskiej” i „notmistrza”:
Dzięki zaktualizowanemu wyrażeniu regularnemu (które obecnie wyklucza „rozwijanie” zamiast „programowanie”):
Przejdź do gałęzi foo, dokonaj nowego zatwierdzenia, a następnie sprawdź nowy oddział, foobar, na podstawie foo:
Moja obecna gałąź to foobar, a jeśli ponownie uruchomię powyższe polecenie, aby wyświetlić listę gałęzi, które chcę usunąć, gałąź „foo” zostanie uwzględniona, nawet jeśli nie została scalona w master:
Jeśli jednak uruchomię tę samą komendę master, gałąź „foo” nie zostanie uwzględniona:
A to po prostu dlatego, że
git branch --merged
domyślnie HEAD bieżącej gałęzi, jeśli nie określono inaczej. Przynajmniej w moim przepływie pracy nie chcę usuwać lokalnych oddziałów, chyba że zostały scalone w master, więc wolę następujący wariant:Odłączony stan HEAD
Poleganie na domyślnym zachowaniu
git branch --merged
ma jeszcze bardziej znaczące konsekwencje w odłączonym stanie HEAD:Spowodowałoby to usunięcie gałęzi, na której byłem, „foobar” wraz z „foo”, co prawie na pewno nie jest pożądanym rezultatem. Jednak dzięki naszemu zmienionemu poleceniu:
Jedna linia, w tym faktyczne usunięcie
Wszystko spakowane w alias git „sweep”:
Alias akceptuje opcjonalną
-f
flagę. Domyślnym działaniem jest usuwanie tylko gałęzi, które zostały scalone w master, ale-f
flaga usunie gałęzie, które zostały scalone w bieżącą gałąź.źródło
git config
atomowy?!f(){ git branch ...
. To deklaracja funkcji, prawda? Dlaczego nie zacząć bezpośrednio odgit branch ...
?git checkout master && git branch -d `git branch --merged` && git checkout -
Tyle że to by usunęłodevelop
, ale może to być prostsze podejście.Git Sweep świetnie sobie z tym radzi.
źródło
Korzystanie z Git w wersji 2.5.0:
źródło
master
gałąź btw!master
.git branch -d $(git branch --merged | grep -v master)
Możesz dodać zatwierdzenie do opcji --merged. W ten sposób możesz upewnić się, że usuwane są tylko gałęzie, które są scalone, tj. Origin / master
Następujące polecenie usunie scalone gałęzie z twojego źródła.
Możesz sprawdzić, które gałęzie zostaną usunięte, zastępując początek git push - usuń za pomocą echa
źródło
Używam następującego skryptu Ruby, aby usunąć moje już połączone lokalne i zdalne gałęzie. Jeśli robię to dla repozytorium z wieloma pilotami i chcę tylko usunąć z jednego, po prostu dodaję instrukcję select do listy pilotów, aby uzyskać tylko te piloty, które chcę.
źródło
\/
na początku instrukcji odrzucenia dlaremote_branches
linii. Czy to literówka, czy służy to celowi?b.split(/\//)
teraz linięJak usunąć scalone gałęzie w konsoli PowerShell
Jeśli chcesz wykluczyć nazwy główne lub dowolne inne gałęzie, możesz potokować za pomocą PowerShell Select-String w ten sposób i przekazać wynik do
git branch -d
:źródło
* master
:)W odpowiedzi kuboon pominięto usuwanie gałęzi, które mają słowo master w nazwie gałęzi. Poniższe poprawia jego odpowiedź:
Oczywiście nie usuwa samej gałęzi „master” :)
źródło
W Git nie ma polecenia, które zrobi to automatycznie. Ale możesz napisać skrypt, który używa poleceń Git, aby dać ci to, czego potrzebujesz. Można to zrobić na wiele sposobów, w zależności od używanego modelu rozgałęziania.
Jeśli chcesz wiedzieć, czy gałąź została scalona w master, poniższe polecenie nie przyniesie rezultatu, jeśli myTopicBranch został scalony (tzn. Możesz go usunąć)
Możesz użyć polecenia gałęzi Git i przeanalizować wszystkie gałęzie w Bash i wykonać
for
pętlę nad wszystkimi gałęziami. W tej pętli sprawdzasz za pomocą powyższego polecenia, czy możesz usunąć gałąź, czy nie.źródło
git branch --merged | grep -Ev '^(. master|\*)' | xargs -n 1 git branch -d
usunie wszystkie lokalne oddziały z wyjątkiem bieżącego wyewidencjonowanego oddziału i / lubmaster
.Oto przydatny artykuł dla tych, którzy chcą zrozumieć te polecenia: Git Clean: Usuń już połączone scalone, autorstwa Stevena Harmana .
źródło
Uwaga : Nie jestem zadowolony z poprzednich odpowiedzi (nie działa na wszystkich systemach, nie działa na zdalnie, nie określa - połączonej gałęzi, nie filtruje dokładnie). Dodaję własną odpowiedź.
Istnieją dwa główne przypadki:
Lokalny
Chcesz usunąć oddziały lokalne, które są już połączone z innym oddziałem lokalnym . Podczas usuwania chcesz zachować kilka ważnych gałęzi, takich jak master, develop itp.
Uwagi :
git branch output --format
„..” oznacza usunięcie białych znaków i umożliwienie dokładnego dopasowania grepgrep -E
jest używany zamiastegrep
, więc działa również w systemach bez egrep (tj: git dla Windows).grep -E -v '^master$|^feature/develop$'
jest określenie lokalnych oddziałów, których nie chcę usuwaćxargs -n 1 git branch -d
: wykonaj usuwanie lokalnych oddziałów (nie będzie działać dla zdalnych)Zdalny
Chcesz usunąć zdalne gałęzie, które są już połączone z inną zdalną gałęzią . Podczas usuwania chcesz zachować niektóre ważne gałęzie, takie jak HEAD, master, wydania itp.
Uwagi :
-r
opcji i podajemy pełną nazwę oddziału :origin/master
grep -E -v '^*HEAD$|^*/master$|^*release'
jest dopasowanie zdalnych gałęzi, których nie chcemy usuwać.cut -d/ -f2-
: usuń niepotrzebny prefiks „origin /”, który w innym przypadku zostałby wydrukowany przezgit branch
polecenie.xargs -n 1 git push --delete origin
: wykonaj usuwanie zdalnych gałęzi.źródło
Jeśli korzystasz z systemu Windows, możesz użyć Windows Powershell lub Powershell 7 z Out-GridView, aby mieć ładną listę gałęzi i wybrać za pomocą myszy, który z nich chcesz usunąć:
po kliknięciu OK Powershell przekaże nazwy gałęzi, aby
git branch -d
je rozkazać i usunąćźródło
Możesz użyć
git-del-br
narzędzia .Możesz go zainstalować za
pip
pomocąPS: Jestem autorem narzędzia. Wszelkie sugestie / opinie są mile widziane.
źródło
Jeśli chcesz usunąć wszystkie lokalne gałęzie, które są już połączone z gałęzią, w której aktualnie się znajdujesz, zaproponowałem bezpieczne polecenie, aby to zrobić, w oparciu o wcześniejsze odpowiedzi:
To polecenie nie wpłynie na twoją bieżącą gałąź ani gałąź główną. Powie ci też, co robi, zanim to zrobi, używając flagi -t xargs.
źródło
Alias zaktualizowanej odpowiedzi Adama :
Zobacz także tę odpowiedź, aby uzyskać przydatne wskazówki dotyczące uciekania przed złożonymi aliasami.
źródło
Używam schematu nazw eque git-flow, więc działa dla mnie bardzo bezpiecznie:
Zasadniczo szuka scalonych zatwierdzeń rozpoczynających się ciągiem znaków
fix/
lubfeature/
.źródło
Spróbuj wykonać następujące polecenie:
Za pomocą
git rev-parse
uzyska aktualną nazwę oddziału w celu jej wykluczenia. Jeśli wystąpił błąd, oznacza to, że nie ma lokalnych oddziałów do usunięcia.Aby zrobić to samo ze zdalnymi gałęziami (zmień
origin
przy pomocy nazwy zdalnej), spróbuj:Jeśli masz wiele pilotów, dodaj
grep origin |
wcześniej,cut
aby filtrować tylkoorigin
.Jeśli powyższe polecenie nie powiedzie się, spróbuj najpierw usunąć scalone gałęzie zdalnego śledzenia:
Następnie
git fetch
ponowniegit push -vd
uruchom pilota i ponownie użyj poprzedniego polecenia.Jeśli często go używasz, rozważ dodanie jako
~/.gitconfig
pliku aliasów .Jeśli omyłkowo usunąłeś niektóre gałęzie, użyj,
git reflog
aby znaleźć utracone zatwierdzenia.źródło
Na podstawie niektórych z tych odpowiedzi stworzyłem też własny skrypt Bash !
Używa
git branch --merged
i,git branch -d
aby usunąć gałęzie, które zostały scalone, i monituje o każdą gałąź przed usunięciem.źródło
Poniższe zapytanie działa dla mnie
a to przefiltruje dowolną gałąź w rurze grep.
Działa dobrze na klonie HTTP, ale nie tak dobrze w przypadku połączenia ssh.
źródło
Od 2018.07
Dodaj to do
[alias]
sekcji swojego~/.gitconfig
:Teraz możesz po prostu zadzwonić,
git sweep
aby wykonać potrzebne czyszczenie.źródło
W systemie Windows z zainstalowanym programem git bash egrep -v nie będzie działać
gdzie
grep -E -v
jest równoważne zegrep -v
Użyj
-d
, aby usunąć już połączone oddziały lub-D
usunąć niezłączonych oddziałyźródło
Użyłem następującej metody, aby usunąć scalone lokalne ORAZ zdalne gałęzie w jednym cmd.
Mam w swoim
bashrc
pliku:oryginalne źródło
Nie usuwa to głównej gałęzi, ale usuwa scalone lokalne i zdalne gałęzie . Gdy masz już to w swoim pliku rc, po prostu uruchom
rmb
, zobaczysz listę połączonych gałęzi, które zostaną wyczyszczone i poprosisz o potwierdzenie akcji. Możesz zmodyfikować kod, aby nie prosił o potwierdzenie, ale prawdopodobnie dobrze jest go zachować.źródło
Napisz skrypt, w którym Git sprawdzi wszystkie gałęzie, które zostały połączone w master.
Więc zrób
git checkout master
.Na koniec usuń scalone gałęzie.
źródło
Przyjęte rozwiązanie jest całkiem dobre, ale ma jeden problem polegający na tym, że usuwa również lokalne oddziały, które nie zostały jeszcze połączone w zdalne.
Jeśli spojrzysz na wynik, zobaczysz coś takiego
Oddziały
bla
iissue_248
są oddziałami lokalnymi, które zostaną usunięte po cichu.Ale możesz również zobaczyć słowo
[gone]
, które wskazuje gałęzie, które zostały wypchnięte do pilota (który już nie ma), a tym samym oznacza, że gałęzie można usunąć.Pierwotną odpowiedź można zatem zmienić na (podzielony na wielowierszowy dla krótszej długości linii)
w celu ochrony jeszcze nie połączonych oddziałów. Również grepowanie dla mistrza, aby go chronić, nie jest potrzebne, ponieważ ma on pilota na początku i nie wyświetla się po jego zniknięciu.
źródło
Dla mnie
git branch --merged
nie pokazuje oddziałów, które zostały połączone za pośrednictwem GitHub PR. Nie jestem pewien powodów, ale używam następującego wiersza, aby usunąć wszystkie lokalne oddziały, które nie mają gałęzi zdalnego śledzenia :Wyjaśnienie:
git branch --format "%(refname:short)"
podaje listę lokalnych oddziałówgit branch -r | grep -v HEAD | cut -d/ -f2-
daje listę zdalnych gałęzi, odfiltrowującHEAD
diff <(...) <(...)
daje różnicę wyjściową dwóch poleceń w nawiasachgrep '<'
filtruje gałęzie, które istnieją na pierwszej liście, ale nie na drugiejcut -c 3-
daje linię zaczynającą się od 3. znaku, usuwając w ten sposób prefiks<
xargs git branch -D
wykonuje sięgit branch -D
dla każdej nazwy oddziałuAlternatywnie możesz tego uniknąć
grep -v '<'
:źródło