Mitten in den Informationen, die von git help fetch
präsentiert werden, gibt es diesen kleinen Punkt:
-p, --prune
Entfernt nach dem Holen alle Remote-Tracking-Zweige, die nicht mehr auf dem Remote existieren.
Vielleicht ist also git fetch -p
das, wonach du suchst?
BEARBEITEN: Gut, für diejenigen, die 3 Jahre nach der Tatsache immer noch über diese Antwort debattieren, hier noch ein wenig mehr Informationen, warum ich diese Antwort präsentiert habe...
Zunächst sagt der Fragesteller, dass er auch "die lokalen Branches löschen möchte, die von den Remote-Branches erstellt wurden [die nicht mehr auf dem Remote existieren]". Dies ist in git
nicht eindeutig möglich. Hier ist ein Beispiel.
Sagen wir, ich habe ein Repo auf einem zentralen Server, und es hat zwei Zweige namens A
und B
. Wenn ich dieses Repo auf mein lokales System klonen, wird mein Klon lokale Verweise (noch keine tatsächlichen Branches) namens origin/A
und origin/B
haben. Nehmen wir an, ich mache folgendes:
git checkout -b A origin/A
git checkout -b Z origin/B
git checkout -b C
Die relevanten Fakten hier sind, dass ich aus irgendeinem Grund einen Branch in meinem lokalen Repo erstellt habe, der einen anderen Namen als sein Ursprung hat, und ich habe auch einen lokalen Branch, der (noch) nicht im Ursprungsrepo existiert.
Angenommen, ich entferne die Branches A
und B
auf dem Remote-Repo und aktualisiere mein lokales Repo (git fetch
in irgendeiner Form), wodurch meine lokalen Verweise origin/A
und origin/B
verschwinden. Jetzt hat mein lokales Repo immer noch drei Branches, A
, Z
und C
. Keiner davon hat einen entsprechenden Branch im Remote-Repo. Zwei von ihnen wurden "aus ... Remote-Branches erstellt", aber selbst wenn ich weiß, dass es früher einen Branch namens B
im Ursprung gab, habe ich keine Möglichkeit zu wissen, dass Z
aus B
erstellt wurde, weil es im Prozess umbenannt wurde, wahrscheinlich aus gutem Grund. Also ist es wirklich ohne einen externen Prozess zur Aufzeichnung von Branch-Origin-Metadaten oder einen Menschen, der die Historie kennt, unmöglich zu sagen, auf welche der drei Branches der Fragesteller abzielt, wenn überhaupt. Ohne einige externe Informationen, die git
nicht automatisch für dich pflegt, ist git fetch -p
so nah dran, wie du kommen kannst, und jede automatische Methode, die buchstäblich das macht, was der Fragesteller gefragt hat, läuft Gefahr, entweder zu viele Branches zu löschen oder einige zu verpassen, die der Fragesteller sonst gerne gelöscht hätte.
Es gibt auch andere Szenarien, zum Beispiel wenn ich drei separate Branches aus origin/A
erstelle, um drei verschiedene Ansätze für etwas zu testen, und dann origin/A
weggeht. Jetzt habe ich drei Branches, die offensichtlich nicht namensgleich sein können, aber sie wurden von origin/A
erstellt, und eine wortwörtliche Interpretation der Frage des Fragestellers würde erfordern, alle drei zu entfernen. Das mag jedoch nicht wünschenswert sein, selbst wenn du einen zuverlässigen Weg finden könntest, um sie abzugleichen...
12 Stimmen
Möglicher Duplikat von Lokale Branches entfernen, die nicht mehr auf dem Server vorhanden sind
8 Stimmen
One-Liner, plattformübergreifend, sieht nicht so aus, als hätte die Katze auf deiner Tastatur geschlafen:
npx git-removed-branches
(Trockenlauf) odernpx git-removed-branches --prune
(für echt). Du musst bereits node.js installiert haben. Siehe Antworten unten für weitere Details.0 Stimmen
Ich denke normalerweise, dass diese Dinge absichtlich und nicht automatisch erledigt werden sollten, da Sie sich sonst offenlegen, etwas zu löschen, das Sie nicht löschen wollten. Daher würde ich bei git branch -d localBranchName und git push origin --delete remoteBranchName bleiben.
3 Stimmen
Für IntelliJ-Benutzer tut das folgende Plugin genau das, was Sie brauchen: plugins.jetbrains.com/plugin/10059-git-branch-cleaner