Kann ich alle lokalen Zweige außer dem aktuellen löschen?

94

Ich möchte alle Zweige löschen, die in der Ausgabe von ...

$ git branch

... aber den aktuellen Zweig in einem Schritt behalten . Ist das möglich? Wenn das so ist, wie?

Sensorario
quelle

Antworten:

66

Basierend auf der Antwort von @pankijs habe ich zwei Git-Aliase erstellt:

[alias]
    # Delete all local branches but master and the current one, only if they are fully merged with master.
    br-delete-useless = "!f(){\
        git branch | grep -v "master" | grep -v ^* | xargs git branch -d;\
    }; f"
    # Delete all local branches but master and the current one.
    br-delete-useless-force = "!f(){\
        git branch | grep -v "master" | grep -v ^* | xargs git branch -D;\
    }; f"

Hinzufügen in ~/.gitconfig


Und wie @torek betonte:

Beachten Sie, dass Kleinbuchstaben -deinen "nicht vollständig zusammengeführten" Zweig nicht löschen (siehe Dokumentation). Mit using -D werden solche Zweige gelöscht , auch wenn dadurch Commits "verloren" gehen. Verwenden Sie dies mit großer Sorgfalt , da dadurch auch die Zweig-Reflogs gelöscht werden, sodass das übliche "Wiederherstellen nach versehentlichem Löschen" ebenfalls nicht funktioniert.

Verwenden Sie die -forceVersion grundsätzlich niemals, wenn Sie nicht zu 300% sicher sind, dass Sie nichts Wichtiges verlieren. Weil es für immer verloren ist .

Vadorequest
quelle
2
Commits für einen gelöschten Zweig sollten noch eine Weile im Reflog sein.
CaptRespect
In der Tat würden die Commits im Reflog bleiben. Aber nicht der Zweig selbst. Ich würde es nicht versuchen, aber ich denke, Sie finden vielleicht Ihre Commits, aber kehren Sie zum Zweigstatus zurück? Ich bezweifle es. Cherry-Pick kann verwendet werden, um Commits in einem gelöschten Zweig abzurufen, aber Sie können den Zweig selbst nicht wiederherstellen.
Vadorequest
1
@Vadorequest Sie können den Zweig neu erstellen, der auf ein bestimmtes Commit verweist, indem Siegit branch branchname commitid
pqnet
@pqnet Ich wusste nicht, dass das die gesamte Geschichte für diesen Zweig neu erstellen würde, danke, gut zu wissen!
Vadorequest
1
@Vadorequest Da Commit-Objekte unveränderlich sind (und als Hashes indiziert sind), muss für jede Bearbeitung ein neues Objekt (mit einem anderen Hash) erstellt werden
pqnet
178
$ git branch | grep -v "master" | xargs git branch -D 

löscht alle Zweige außer dem Master (ersetzen Sie den Master durch den Zweig, den Sie behalten möchten, aber dann wird der Master gelöscht)

pankijs
quelle
29
Wenn Sie den aktuellen Zweig behalten möchten, verwenden Sie grep -v ^*.
Schwern
2
Viele Quellen zeigen mir dieses Skript, aber wenn ich es ausführe, sagen Sie mir immer, dass Zweige nicht gefunden wurden :(
tucq88
1
Dies ist nicht korrekt, es wird kein Zweig gelöscht master-copy, der zum Beispiel
mvallebr
2
Passen Sie die Regex dann nach Bedarf an, zum Beispielgrep -v "^ *master$"
Brad Koch
7
Wenn Sie zwei Zweige behalten möchten, verwenden Sie grep -v "master\|my-other-branch".
Derek Soike
16

zuerst (wechseln Sie zu dem Zweig, den Sie behalten möchten> ex : master ):

git checkout master

zweitens (stellen Sie sicher , dass Sie auf dem Master sind )

git branch -D $(git branch)
KhogaEslam
quelle
3
sehr schnell und einfach. Warum wird das nicht positiv bewertet?
princebillyGK
1
Es ist die einfachste und beste Antwort für mich.
Saleh Enam Shohag
1
Wenn Sie PowerShell verwenden, verwenden Sie git branch -D $(git branch).Trim().
NatoBoram
13

git branch -d (oder -D ) erlaubt mehrere Filialnamen, aber es ist etwas schwierig, automatisch "alle lokalen Filialen außer der, in der ich mich gerade befinde" anzugeben, ohne mindestens ein wenig Code zu schreiben.

Die "beste" (formal korrekte) Methode besteht git for-each-refdarin, die Filialnamen abzurufen:

git for-each-ref --format '%(refname:short)' refs/heads

Aber dann ist es noch schwieriger herauszufinden, auf welchem ​​Zweig Sie sich befinden (git symbolic-ref HEAD ist die "formal korrekte" Methode dafür, wenn Sie ein ausgefallenes Skript schreiben möchten).

Bequemer können Sie verwenden git branch, um Ihre lokalen Zweigstellennamen mit zwei Leerzeichen oder (für den aktuellen Zweig) mit einem Sternchen zu drucken *. Führen Sie dies also durch, um die *Version zu entfernen, und Sie erhalten durch Leerzeichen getrennte Zweignamen, die Sie dann an folgende Adresse übergeben können git branch -d:

git branch -d $(git branch | grep -v '^*')

oder:

git branch | grep -v '^*' | xargs git branch -d

Beachten Sie, dass Kleinbuchstaben -deinen "nicht vollständig zusammengeführten" Zweig nicht löschen (siehe Dokumentation). Mit using -Dwerden solche Zweige gelöscht, auch wenn dadurch Commits "verloren" gehen. Verwenden Sie dies mit großer Sorgfalt, da dadurch auch die Zweig-Reflogs gelöscht werden, sodass das übliche "Wiederherstellen nach versehentlichem Löschen" ebenfalls nicht funktioniert.

torek
quelle
Dies sollte der Fall sein git branch -D $(git branch | grep -v '^*'), wenn Sie die zusammengeführten Zweige löschen möchten.
Pratik Singhal
@PratikSinghal: Das löscht alle anderen Zweige, nicht nur Zweige, die Git als "zusammengeführt" betrachtet. Dies ist selten eine gute Idee. Auf diese beiden Punkte habe ich bereits in meiner Antwort hingewiesen.
Torek
12

So entfernen Sie alle zusammengeführten Zweige (außer den aktuellen -v ‘*’):

git branch --merged | grep -v '*' | xargs git branch -D

Ich habe auch einen solchen Befehl für die vollständige Bereinigung des Repos gemacht:

alias git-clean="git branch  | grep -v '*' | grep -v 'master' | xargs git branch -D  && git reset --hard && git clean -d -x -f"

von hier genommen .

Stepan Suworow
quelle
1
Dadurch werden nur die zusammengeführten Zweige gelöscht.
Pratik Singhal
10

Löschen Sie alle Zweige außer einem bestimmten Zweig :

git branch | grep -v "branch name" | xargs git branch -D

Löschen Sie alle lokalen Zweige außer Entwickeln und Mastern

git branch | grep -v "develop" | grep -v "master" | xargs git branch -D
Asad Manzoor
quelle
5

Verwenden Sie für Windows in Powershell:

git branch | %{ $_.Trim() } | ?{ $_ -ne 'master' } | %{ git branch -D $_ }
Robert Corvus
quelle
4

Löschen Sie alle zusammengeführten Zweige lokal:

git branch -D `git branch --merged | grep -v \* | xargs`

Löschen Sie alle Zweige außer einem bestimmten Zweig :

git branch | grep -v "branch name" | xargs git branch -D

Löschen Sie alle lokalen Zweige außer Entwickeln und Mastern

git branch | grep -v "develop" | grep -v "master" | xargs git branch -D
Asad Manzoor
quelle
3

Ich habe dieses Konstrukt einmal für meine Windows-Umgebung erstellt. Vielleicht hilft es jemand anderem. Während der Ausführung werden der Master und der aktuelle Zweig nicht gelöscht . Alle anderen zusammengeführten Zweige werden trotzdem gelöscht.

@echo off
cd PATH_TO_YOUR_REPO

REM -- Variable declerations
set "textFile=tempBranchInfo.txt"
set "branchToKeep=master"
set "branchToReplaceWith="
git branch --merged > %textFile%

REM -- remove "master" from list to keep the branch
for /f "delims=" %%i in ('type "%textFile%" ^& break ^> "%textFile%" ') do (
    set "line=%%i"
    setlocal enabledelayedexpansion
    >>"%textFile%" echo(!line:%branchToKeep%=%branchToReplaceWith%!
    endlocal
)

REM -- execute branch delete commands
for /f "delims=" %%a in (%textFile%) do (
    git branch -D %%a
)

REM -- remove temp-file with branch information inside
DEL %textFile%

REM -- show local branches after the cleaning
echo Local branches:
git branch

pause 
exit
George Maharis
quelle
3

So löschen Sie alle Zweige außer dem aktuellen Zweig in einem Schritt:

git branch | grep -v $(git rev-parse --abbrev-ref HEAD) | xargs git branch -D

Dan Dye
quelle
2

Angenommen git branch, der aktuelle Zweig wird mit dem Präfix *; Mit Powershell löscht der folgende Liner alle Zweige, die nicht mit beginnen *.

git branch | ? { $_ -lt "*" } | % { git branch -D $_.Trim() }

? = Wo-Objekt

% = Foreach-Objekt

Aaron
quelle
1

Daher sehe ich hier viele fest codierte Zweignamen ... Und ich denke, meine Antwort hier ist genauer auf den Teil der Frage "Aktueller Zweig", während sie einzeilig und lesbar bleibt, um Neulinge wie mich zu verprügeln. Nur um das Guthaben dort zu platzieren, wo es fällig ist, basiert die Antwort offensichtlich auch auf der Antwort von @ pankijs.

git branch | grep -v $(git branch --show-current) | xargs git branch -d

und ich habe es in einer Zeile in meinen .bash_aliases auch in debian aliased.

alias gitbclean='git branch | grep -v $(git branch --show-current) | xargs git branch -d'

(Obwohl ich denke, dass einige Bash-Funktionen aktiviert werden müssen, damit der Unterbefehl auf einigen Befehlszeilen ausgeführt werden kann)

NullifiedWarp
quelle
1

Ich benutze dies, weil ich selektiver bin, was ich nicht löschen möchte. Mit dem folgenden Befehl werden alle Zweige außer Master, Develop und dem aktuellen Zweig entfernt.

BRANCHES=$(git branch | egrep -v "(master|develop|\*)" | xargs git branch -D)
echo $BRANCHES

Also habe ich das in meine ~/.zshrc

delete_branches() {
  BRANCHES=$(git branch | egrep -v "(master|develop|\*)" | xargs git branch -D)
  echo $BRANCHES
}

alias cleanup_branches=delete_branches
Justin Rice
quelle
0

IMHO ist der sicherste Weg, um lokale Niederlassungen zu entfernen ,:

git branch -av | grep "\[gone\]" | awk '{print $1}' | xargs git branch -d

Weitere Informationen zu diesem Thema finden Sie unter Alle lokalen Git-Zweige löschen

elbik
quelle
Um den goneMarker zu drucken , sollten Sie ihn verwenden -vv(zweimal ausführlich), während er -aIhnen nicht hilft (er listet auch entfernte Zweige auf)
pqnet