'git branch -av' zeigt den nicht mehr vorhandenen Remote-Zweig an

168

Dies ist wahrscheinlich eine dumme Frage, aber ich bin brandneu bei Git und sehe einen entfernten Zweig, der nicht mehr existiert.

$ git branch -a
* master
  remotes/origin/master
  remotes/origin/production

Ich glaube nicht, dass der Produktionszweig remote existiert und kann nicht herausfinden, warum er immer noch lokal angezeigt wird. Wie kann ich diesen Zweig löschen / entfernen? So sieht ein Versuch aus, es zu entfernen:

$ git push origin :production

error: unable to push to unqualified destination: production
The destination refspec neither matches an existing ref on the remote nor
begins with refs/, and we are unable to guess a prefix based on the source ref.
error: failed to push some refs to 'git@IP:puppet.git'

Ich kann den vermeintlich entfernten Produktionszweig auschecken, bekomme aber Folgendes:

$ git checkout origin/production
Note: checking out 'origin/production'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at c323996... added powerdns module, no really

Ich habe keine Ahnung, was zum Teufel ich tue. Jede Hilfe wäre dankbar.

Carpe Noctem
quelle
Was ist die Ausgabe git branch -anach einem git fetch?
Alediaferia
Mögliches Duplikat von Wie lösche ich einen Remote-Zweig in GitHub?
Cascabel
Das von mir vorgeschlagene Duplikat enthält eine Antwort, die viel mehr erklärt als die Manojlds hier.
Cascabel

Antworten:

336

Du musst:

git remote prune origin
Manojlds
quelle
8
Danke das hat funktioniert! Können Sie näher erläutern, was sich hinter den Kulissen abspielt?
CarpeNoctem
12
Dies sind Remote-Tracking-Zweige in Ihrem lokalen Repo, und Sie müssen sie löschen, wenn die Zweige im Remote-Repo gelöscht werden.
Manojlds
2
Selten finde und implementiere ich eine so einfache Frage und Antwort so schnell.
Jleach
Hervorragend. In meinem lokalen Bereich sah ich seltsame Zweige, die keine Verbindung zum Codebasis-Repo hatten. Als ich diesen Befehl ausführte, optimierte er meinen lokalen Ursprungszweig und fügte dann den vorgelagerten Master hinzu. Danke
Ankur Srivastava
54

Es gibt also zwei Probleme. Denken Sie in beiden Fällen daran, dass Git verteilt ist.

Zuerst. Wenn du Dinge wie machst

$ git branch -a

Der Vorgang wird auf Ihrem lokalen Repo ausgeführt, NICHT auf dem Remotecomputer. Mit anderen Worten, Ihr lokales Repo meldet alle Filialen, die bekannt sind. Dies können lokale Zweige (wie 'Master') oder entfernte Zweige sein, die von einer Fernbedienung abgerufen wurden . Seit dem letzten Abruf hat sich der 'Produktions'-Zweig des Remote-Repos geändert, aber Ihr lokales Repo weiß dies nicht. Die Antwort von manojlds ist richtig. Lauf

$ git Remote Prune Origin

abgestandene Äste zu entfernen.

Der Befehl 'git push origin: Production' wird zum Löschen des Zweigs aus dem Git-Repo des Remotecomputers verwendet. Nicht dein lokales Repo. In diesem Fall hat bereits eine andere Person den Zweig im Git-Repo des Remotecomputers gelöscht, sodass diese Fehlermeldung angezeigt wird.

Hier ist ein Link , der diese Befehle zusammenfasst.

Das zweite Problem betrifft die Kaufabwicklung.

Wenn Sie einen Zweig auschecken, möchten Sie dies von einem lokalen Zweig aus tun , nicht von dem Remote-Zweig. Aus diesem Grund erhalten Sie die Fehlermeldung über einen abgetrennten HEAD. Das Git-Notes-Repo bietet eine gute Erklärung des Problems im Detail. Grundsätzlich lautet der Schlüsselbegriff

Wenn Sie jedoch etwas auschecken, das kein richtiger lokaler Zweigname ist, ist HEAD kein symbolischer Verweis mehr auf irgendetwas. Stattdessen enthält es tatsächlich den SHA-1-Hash (die Commit-ID) des Commits, zu dem Sie wechseln.

Wie kann man nun einen lokalen Zweig auschecken, der mit dem Remote-Zweig identisch ist?

Ganz einfach, Sie erstellen eine lokale Zweigstelle zum Zeitpunkt des Auscheckens der Remote-Zweigstelle.

$ git checkout -b my_local_branch Herkunft / Produktion

Pablo Maurin
quelle
20
git remote prune origin

ist richtig, wenn Sie nur hinzufügen, können Sie die --dry-runOption verwenden, die angibt, welche Zweige von Ihrem lokalen Repo entfernt werden, sie jedoch nicht wirklich beschneidet

git remote prune origin --dry-run
0xcrab
quelle