Ich habe viele Git-Zweige. Wie lösche ich bereits zusammengeführte Zweige? Gibt es eine einfache Möglichkeit, sie alle zu löschen, anstatt sie einzeln zu löschen?
git
github
version-control
branch
feature-branch
Nyambaa
quelle
quelle
git branch -D
jeder Zweig gelöscht, unabhängig davon, ob er zusammengeführt wurde oder nicht.master
jedem Zweig ist. Ihr lokaler Client listet jedoch weiterhin die alten Zweige auf, wenn Sie ausgeführt werdengit branch -a
. Verwenden Siegit fetch --prune
, um sie zu entfernen (gemäß dieser Antwort ).git delete-merged --doit origin
odergit delete-merged --doit --local
rm -fr work && git clone http://example.com/work.git
Im Laufe der Jahre ist es der einfachste Weg geworden, mit Git aus einer Gurke herauszukommen.Antworten:
AKTUALISIEREN:
Sie können andere Zweige hinzufügen, um Master und Entwickler auszuschließen, wenn Ihr Workflow diese als möglichen Vorfahren hat. Normalerweise verzweige ich von einem "Sprint-Start" -Tag und Master, Dev und Qa sind keine Vorfahren.
Listen Sie zunächst alle Zweige auf, die in Remote zusammengeführt wurden.
Möglicherweise sehen Sie einige Zweige, die Sie nicht entfernen möchten. Wir können einige Argumente hinzufügen, um wichtige Zweige zu überspringen, die wir nicht löschen möchten, wie z. B. Master oder Entwicklung. Der folgende Befehl überspringt den Hauptzweig und alles, was dev enthält.
Wenn Sie überspringen möchten, können Sie es wie folgt zum Befehl egrep hinzufügen. Der Zweig
skip_branch_name
wird nicht gelöscht.So löschen Sie alle lokalen Zweige, die bereits mit dem aktuell ausgecheckten Zweig zusammengeführt wurden:
Sie können sehen, dass Master und Dev ausgeschlossen sind, falls sie ein Vorfahr sind.
Sie können einen zusammengeführten lokalen Zweig löschen mit:
Wenn es nicht zusammengeführt wird, verwenden Sie:
So löschen Sie es von der Remote-Verwendung:
Sobald Sie den Zweig von der Fernbedienung gelöscht haben, können Sie ihn entfernen, um Fernverfolgungszweige zu entfernen:
oder beschneiden Sie einzelne Fernverfolgungszweige, wie die andere Antwort andeutet, mit:
Hoffe das hilft.
quelle
git branch --merged | %{$_.trim()} | ?{$_ -notmatch 'develop' -and $_ -notmatch 'master'} | %{git branch -d $_}
fatal: branch name required
wenn Sie keine Zweige haben, die gelöscht werden sollen. Um dies zu vermeiden, können Sie an übergeben-r
,xargs
damit es nicht ausgeführt wird,git branch -d
wenn der Standard leer ist. (Dies ist eine GNU xargs-Erweiterung, laut Manpage).So löschen Sie alle Zweige auf der Fernbedienung, die bereits zusammengeführt wurden:
In neueren Versionen von Git
UPDATE (von @oliver; da passt nicht in einen Kommentar, aber es gibt bereits genügend Antworten) : Wenn Sie sich in Zweig ABC befinden, wird ABC in den Ergebnissen von angezeigt, da
git branch -r --merged
der Zweig nicht angegeben ist, sodass der Zweig standardmäßig den aktuellen Zweig und einen Zweig verwendet qualifiziert sich immer als mit sich selbst zusammengeführt (da es keine Unterschiede zwischen einem Zweig und sich selbst gibt!).Geben Sie also entweder den Zweig an:
ODER erster Checkout-Master:
quelle
dev
also musste ich das ändern| grep origin
nachher hinzufügengrep -v master
, um zu verhindern, dass Zweige anderer Fernbedienungen zum Ursprung gebracht werden. Es wirdgit branch -r --merged | grep -v master | grep origin | sed 's/origin\//:/' | xargs -n 1 echo
develop
Zweig auszuschließen .git branch -r --merged | grep -v master | grep -v develop | sed 's/origin\///' | xargs -n 1 git push --delete origin
. Nun stellte sich heraus, dass dies mein Pseudonym war.-r
Argument, das ich nirgendwo anders erwähnt habe. Es ist selbstverständlich, dass nur lokale Niederlassungen eine Haushaltsführung wert sind. Aber auch Fernbedienungen sind voller Müll.myFeatureBranch
, werden diese gelöschtorigin/myFeatureBranch
. Wahrscheinlich ist es am besten,git checkout master
zuerst.Nur Adams Antwort ein wenig erweitern:
Fügen Sie dies Ihrer Git-Konfiguration hinzu, indem Sie ausführen
git config -e --global
Und dann können Sie alle lokalen zusammengeführten Zweige auf einfache Weise löschen
git cleanup
.quelle
git branch --merged master
Da Sie sich ansehen möchten, was mit dem Master zusammengeführt wurde, ist der Zweig derzeit nicht ausgecheckt?develop
oder oderdev
und in diesem Fall schlägt der Befehl fehl,fatal: malformed object name
es ist besser, einen generischen Befehl zu haben und Sie haben die Verantwortung, ihn auszuführen-r
zuxargs
werden unnötige Fehler (branch name required
) vermieden , wenn dieser Alias mehrmals ausgeführt wird oder wenn kein Zweig mehr gelöscht werden muss. Mein Alias sieht so aus:cleanup = "!git branch --merged | grep -v -P '^\\*|master|develop' | xargs -n1 -r git branch -d"
Dies funktioniert auch, um alle zusammengeführten Zweige außer dem Master zu löschen.
quelle
master
. Versuchen Sie esgrep -v ^master$
für die Mitte.| grep -v '^\*'
vermeiden, den aktuellen Zweig zu löschen, wenn Sie nicht auf mastergrep -v '^ master$'
. Wenn Sie es selbst eingeben und eines verpassen, werden Sie es löschen,master
wenn Sie nicht darauf sind.git branch
jeder Zweigname in einer neuen Zeile mit zwei Leerzeichen links aufgelistet wird, wenn es sich nicht um den aktuell ausgecheckten Zweig handelt. Sie haben im Wesentlichen garantiert, dass jeder, der diesen Befehl ausführt, seinen Hauptzweig löscht, es sei denn, es handelt sich um den aktuell ausgecheckten Zweig.Sie möchten die
master
&develop
-Zweige von diesen Befehlen ausschließen.Lokaler Git klar:
Remote Git klar:
Synchronisieren Sie die lokale Registrierung von Remote-Zweigen:
quelle
git config --global --add fetch.prune true
beim Abrufen oder Ziehen automatisch beschneiden.git branch -r --merged | grep -v '\*\|master\|develop' | grep '^\s*origin/' | sed 's/origin\///' | tr "\n" " " | xargs git push --delete origin
Für diejenigen unter Ihnen, die unter Windows arbeiten und PowerShell-Skripte bevorzugen, ist hier eines, das lokale zusammengeführte Zweige löscht:
quelle
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
(Seufz, ersetzen Sie doppelte Anführungszeichen durch einfache, ich bin nicht sicher, wie ein Literal formatiert werden soll, das Backquotes enthält)Ich benutze Adams Antwort seit Jahren. Das heißt, dass es einige Fälle gibt, in denen es sich nicht so verhalten hat, wie ich es erwartet hatte:
1 & 2 waren einfach zu adressieren, mit nur einer Änderung der Regex. 3 hängt vom gewünschten Kontext ab (dh löscht nur Zweige, die nicht mit dem Master oder mit Ihrem aktuellen Zweig zusammengeführt wurden). 4 kann katastrophal sein (obwohl mit wiederherstellbar
git reflog
), wenn Sie dies unbeabsichtigt im getrennten HEAD-Zustand ausgeführt haben.Schließlich wollte ich, dass dies alles in einem Einzeiler ist, für den kein separates Skript (Bash | Ruby | Python) erforderlich ist.
TL; DR
Erstellen Sie einen Git-Alias "Sweep", der ein optionales
-f
Flag akzeptiert :und rufe es auf mit:
oder:
Die lange, detaillierte Antwort
Für mich war es am einfachsten, ein Beispiel für ein Git-Repo mit einigen Zweigen und Commits zu erstellen, um das richtige Verhalten zu testen:
Erstellen Sie ein neues Git-Repo mit einem einzigen Commit
Erstellen Sie einige neue Zweige
Gewünschtes Verhalten: Wählen Sie alle zusammengeführten Zweige aus, außer: Master, Entwickeln oder Aktuell
Der ursprüngliche Regex vermisst die Zweige "meisterhaft" und "notmaster":
Mit dem aktualisierten regulären Ausdruck (der jetzt "Entwickeln" anstelle von "Entwickeln" ausschließt):
Wechseln Sie zu Zweig foo, machen Sie ein neues Commit und checken Sie dann einen neuen Zweig aus, foobar, basierend auf foo:
Mein aktueller Zweig ist foobar. Wenn ich den obigen Befehl erneut ausführe, um die zu löschenden Zweige aufzulisten, wird der Zweig "foo" eingeschlossen, obwohl er nicht mit master zusammengeführt wurde:
Wenn ich jedoch denselben Befehl auf dem Master ausführe, ist der Zweig "foo" nicht enthalten:
Dies liegt einfach daran, dass
git branch --merged
standardmäßig der HEAD des aktuellen Zweigs verwendet wird, sofern nicht anders angegeben. Zumindest für meinen Workflow möchte ich keine lokalen Zweige löschen, es sei denn, sie wurden zum Master zusammengeführt. Daher bevorzuge ich die folgende Variante:Freistehender HEAD-Zustand
Das Verlassen auf das Standardverhalten von
git branch --merged
hat noch bedeutendere Konsequenzen im getrennten HEAD-Zustand:Dies hätte den Zweig gelöscht, auf dem ich gerade war, "foobar" zusammen mit "foo", was mit ziemlicher Sicherheit nicht das gewünschte Ergebnis ist. Mit unserem überarbeiteten Befehl jedoch:
Eine Zeile, einschließlich des tatsächlichen Löschvorgangs
Alles in einem Git-Alias "Sweep" verpackt:
Der Alias akzeptiert ein optionales
-f
Flag. Das Standardverhalten besteht darin, nur Zweige zu löschen, die mit dem Master zusammengeführt wurden. Das-f
Flag löscht jedoch Zweige, die mit dem aktuellen Zweig zusammengeführt wurden.quelle
git config
atomar?!f(){ git branch ...
. Es ist eine Funktionsdeklaration, oder? Warum nicht direkt mit anfangengit branch ...
?git checkout master && git branch -d `git branch --merged` && git checkout -
Abgesehen davon, dass es gelöscht werden würdedevelop
, aber möglicherweise ein einfacherer Ansatz ist.Git Sweep macht das großartig.
quelle
Verwenden von Git Version 2.5.0:
quelle
master
übrigens den Zweig löschen!master
.git branch -d $(git branch --merged | grep -v master)
Sie können das Commit zur Option --merged hinzufügen. Auf diese Weise können Sie sicherstellen, dass nur Zweige entfernt werden, die mit dem Ursprung / Master zusammengeführt werden
Mit dem folgenden Befehl werden zusammengeführte Zweige von Ihrem Ursprung entfernt.
Sie können testen, welche Zweige entfernt werden, indem Sie den Git-Push-Ursprung ersetzen - durch Echo löschen
quelle
Ich verwende das folgende Ruby-Skript, um meine bereits zusammengeführten lokalen und Remote-Zweige zu löschen. Wenn ich es für ein Repository mit mehreren Fernbedienungen mache und nur von einer löschen möchte, füge ich einfach eine select-Anweisung zur Fernbedienungsliste hinzu, um nur die gewünschten Fernbedienungen zu erhalten.
quelle
\/
am Anfang der Ablehnungsanweisung für dieremote_branches
Zeile. Ist das ein Tippfehler oder erfüllt es einen Zweck?b.split(/\//)
Linie jetztSo löschen Sie zusammengeführte Zweige in der PowerShell-Konsole
Wenn Sie Master- oder andere Verzweigungsnamen ausschließen möchten , können Sie PowerShell Select-String wie folgt weiterleiten und das Ergebnis an
git branch -d
folgende Adresse übergeben :quelle
* master
:)kuboons Antwort hat das Löschen von Zweigen verpasst, deren Zweigname das Wort master enthält. Folgendes verbessert seine Antwort:
Natürlich wird der "Master" -Zweig selbst nicht gelöscht :)
quelle
In Git gibt es keinen Befehl, der dies automatisch für Sie erledigt. Sie können jedoch ein Skript schreiben, das Git-Befehle verwendet, um Ihnen das zu geben, was Sie benötigen. Dies kann auf viele Arten erfolgen, je nachdem, welches Verzweigungsmodell Sie verwenden.
Wenn Sie wissen müssen, ob ein Zweig mit dem Master zusammengeführt wurde, gibt der folgende Befehl keine Ausgabe aus, wenn myTopicBranch zusammengeführt wurde (dh Sie können ihn löschen).
Sie können den Befehl Git branch verwenden und alle Zweige in Bash analysieren und eine
for
Schleife über alle Zweige durchführen. In dieser Schleife prüfen Sie mit dem obigen Befehl, ob Sie den Zweig löschen können oder nicht.quelle
git branch --merged | grep -Ev '^(. master|\*)' | xargs -n 1 git branch -d
löscht alle lokalen Zweige mit Ausnahme des aktuell ausgecheckten Zweigs und / odermaster
.Hier ist ein hilfreicher Artikel für diejenigen, die diese Befehle verstehen möchten: Git Clean: Löschen bereits zusammengeführter Zweige von Steven Harman .
quelle
Hinweis : Ich bin mit früheren Antworten nicht zufrieden (nicht auf allen Systemen, nicht auf Remote-Basis, ohne Angabe des --merged-Zweigs, ohne genaue Filterung). Also füge ich meine eigene Antwort hinzu.
Es gibt zwei Hauptfälle:
Lokal
Sie möchten lokale Zweige löschen , die bereits mit einem anderen lokalen Zweig zusammengeführt wurden . Während des Löschvorgangs möchten Sie einige wichtige Zweige wie Master, Entwicklung usw. beibehalten.
Anmerkungen :
git branch output --format
".." dient zum Entfernen von Leerzeichen und zum Ermöglichen eines genauen Grep-Abgleichsgrep -E
wird anstelle von verwendetegrep
, so funktioniert es auch in Systemen ohne egrep (dh: git für Windows).grep -E -v '^master$|^feature/develop$'
ist es, lokale Zweige anzugeben, die ich nicht löschen möchtexargs -n 1 git branch -d
: Löschen Sie lokale Zweige (bei Remote-Zweigen funktioniert dies nicht).Fernbedienung
Sie möchten entfernte Zweige löschen , die bereits mit einem anderen entfernten Zweig zusammengeführt wurden . Während des Löschvorgangs möchten Sie einige wichtige Zweige wie HEAD, Master, Releases usw. beibehalten.
Anmerkungen :
-r
Option und geben den vollständigen Filialnamen an :origin/master
grep -E -v '^*HEAD$|^*/master$|^*release'
soll mit den entfernten Zweigen übereinstimmen, die wir nicht löschen möchten.cut -d/ -f2-
: Entfernen Sie das nicht benötigte Präfix 'origin /', das sonst vomgit branch
Befehl ausgedruckt wird .xargs -n 1 git push --delete origin
: Löschen Sie entfernte Zweige.quelle
Wenn Sie unter Windows arbeiten, können Sie Windows Powershell oder Powershell 7 mit Out-GridView verwenden , um eine schöne Liste von Zweigen zu erstellen und mit der Maus auszuwählen, welche Sie löschen möchten:
Nach dem Klicken auf OK übergibt Powershell die Namen dieser Zweige an den
git branch -d
Befehl und löscht siequelle
Sie können das
git-del-br
Werkzeug verwenden .Sie können es über
pip
mit installierenPS: Ich bin der Autor des Tools. Anregungen / Feedback sind willkommen.
quelle
Wenn Sie alle lokalen Zweige löschen möchten, die bereits mit dem Zweig zusammengeführt wurden, in dem Sie sich gerade befinden, habe ich auf der Grundlage früherer Antworten einen sicheren Befehl dazu erstellt:
Dieser Befehl wirkt sich nicht auf Ihren aktuellen Zweig oder Ihren Hauptzweig aus. Mit dem Flag -t von xargs erfahren Sie auch, was es tut, bevor es es tut.
quelle
Alias-Version von Adams aktualisierter Antwort :
In dieser Antwort finden Sie auch nützliche Tipps zum Entkommen komplexer Aliase.
quelle
Ich verwende ein git-flow-ähnliches Namensschema, daher funktioniert dies für mich sehr sicher:
Grundsätzlich wird nach zusammengeführten Commits gesucht, die entweder mit string
fix/
oder beginnenfeature/
.quelle
Versuchen Sie den folgenden Befehl:
Bei Verwendung
git rev-parse
wird der aktuelle Filialname abgerufen abgerufen, um ihn auszuschließen. Wenn Sie den Fehler erhalten haben, müssen keine lokalen Zweige entfernt werden.origin
Versuchen Sie Folgendes, um dasselbe mit Remote-Zweigen zu tun (ändern Sie Ihren Remote-Namen):Falls Sie mehrere Fernbedienungen haben, fügen Sie
grep origin |
vor ,cut
um Filter nur dasorigin
.Wenn der obige Befehl fehlschlägt, versuchen Sie zuerst, die zusammengeführten Remote-Tracking-Zweige zu löschen:
Dann
git fetch
die Fernbedienung erneut und den vorherigengit push -vd
Befehl erneut verwenden.Wenn Sie es häufig verwenden, sollten Sie es als Aliase in Ihre
~/.gitconfig
Datei aufnehmen.Falls Sie versehentlich einige Zweige entfernt haben, verwenden Sie diese Option,
git reflog
um die verlorenen Commits zu finden.quelle
Basierend auf einigen dieser Antworten habe ich mein eigenes Bash-Skript erstellt, um es auch zu tun !
Es verwendet
git branch --merged
undgit branch -d
löscht die zusammengeführten Zweige und fordert Sie vor dem Löschen auf, die einzelnen Zweige einzugeben.quelle
Die folgende Abfrage funktioniert für mich
Dadurch wird jeder Zweig in der Grep-Pipe gefiltert.
Funktioniert gut über http Klon, aber nicht so gut für die SSH-Verbindung.
quelle
Stand 2018.07
Fügen Sie dies zu einem
[alias]
Abschnitt Ihres~/.gitconfig
:Jetzt können Sie einfach anrufen
git sweep
, um die erforderliche Bereinigung durchzuführen.quelle
Unter Windows mit installiertem Git Bash funktioniert egrep -v nicht
wo
grep -E -v
ist gleichbedeutend mitegrep -v
Verwenden Sie
-d
bereits entfernen fusionierte Zweige oder-D
entfernen unmerged Zweigequelle
Ich habe die folgende Methode verwendet, um zusammengeführte lokale UND entfernte Zweige in einem cmd zu entfernen .
Ich habe Folgendes in meiner
bashrc
Datei:Originalquelle
Dadurch wird der Hauptzweig nicht gelöscht, sondern zusammengeführte lokale UND Remote-Zweige entfernt . Sobald Sie dies in Ihrer RC-Datei haben, führen
rmb
Sie einfach eine Liste der zusammengeführten Zweige aus, die bereinigt und zur Bestätigung der Aktion aufgefordert werden. Sie können den Code so ändern, dass er nicht ebenfalls um Bestätigung bittet, aber es ist wahrscheinlich gut, ihn beizubehalten.quelle
Schreiben Sie ein Skript, in dem Git alle Zweige auscheckt, die zum Master zusammengeführt wurden.
Dann mach es
git checkout master
.Löschen Sie abschließend die zusammengeführten Zweige.
quelle
Die akzeptierte Lösung ist ziemlich gut, hat aber das einzige Problem, dass auch lokale Zweige gelöscht werden, die noch nicht zu einer Fernbedienung zusammengeführt wurden.
Wenn Sie sich die Ausgabe von ansehen, werden Sie so etwas wie sehen
Zweige
bla
undissue_248
sind lokale Zweige, die stillschweigend gelöscht würden.Sie können aber auch das Wort sehen
[gone]
, das auf Zweige hinweist, die auf eine Fernbedienung verschoben wurden (die jetzt weg ist), und somit darauf hinweist, dass Zweige gelöscht werden können.Die ursprüngliche Antwort kann daher in (für kürzere Zeilenlänge in mehrere Zeilen aufgeteilt) geändert werden.
zum Schutz der noch nicht zusammengeschlossenen Zweige. Auch das Greifen nach Master, um es zu schützen, ist nicht erforderlich, da dies eine Fernbedienung am Ursprung hat und nicht als weg angezeigt wird.
quelle
Für mich werden
git branch --merged
keine Zweige angezeigt, die über GitHub PR zusammengeführt wurden. Ich bin mir der Gründe nicht sicher, aber ich verwende die folgende Zeile, um alle lokalen Zweige zu löschen , die keinen Fernverfolgungszweig haben :Erläuterung:
git branch --format "%(refname:short)"
gibt eine Liste der lokalen Niederlassungengit branch -r | grep -v HEAD | cut -d/ -f2-
Gibt eine Liste der entfernten Zweige an, die herausgefiltert werdenHEAD
diff <(...) <(...)
gibt einen Unterschied in der Ausgabe von zwei Befehlen in Klammern angrep '<'
filtert Zweige, die in der ersten Liste vorhanden sind, jedoch nicht in der zweitencut -c 3-
Gibt eine Zeile ab dem 3. Zeichen an, wodurch das Präfix entfernt wird<
xargs git branch -D
wirdgit branch -D
für jeden Filialnamen ausgeführtAlternativ können Sie Folgendes vermeiden
grep -v '<'
:quelle