Warum kann ich einen Zweig auschecken, der auf GitHub entfernt wurde?


26

In unserem GitHub-Repository hat ein Mitarbeiter einen Zweig mit dem Namen entfernt release. Aber wenn ich git checkout releaselokal laufe , bekomme ich immer den entfernten Zweig release. Das Gleiche gilt, auch wenn ich einen anderen Zweig ausgecheckt, den releaseZweig mit gelöscht git branch -D releaseund erneut ausgeführt habe git checkout release.

Gibt es etwas im GitHub-Repository zu reparieren, oder soll ich etwas lokal reparieren?


1
Was wird git branch --remotenach dem Ausführen ausgegeben git fetch? Möglicherweise müssen Sie mit beschneiden git fetch -p, um gelöschte Remote-Zweige zu vergessen.
Stephen Kitt

2
Wenn dieser Zweig jemals zu GitHub gepusht wurde und Sie danach gezogen haben, haben Sie auch eine Kopie des Zweigs. Jedes Git-Repository ist komplett für sich, es sei denn, Sie haben einen flachen Klon oder etwas anderes verwendet.
muru

@ StephenKitt: Danke. git branch --remoteAusgabe origin/release. Wollen Sie git fetch -pohne zusätzliche Argumente ausführen und werden alle gelöschten Remote-Zweige entfernt?
Tim

1
Ja, git fetch -pohne zusätzliche Argumente werden alle gelöschten Remote-Zweige entfernt.
Stephen Kitt

1
Willkommen in der Welt der verteilten Versionskontrolle!
chrylis -on strike-

Antworten:


24

Nach dem Löschen eines Zweigs auf der Remote-Seite wird dieser zuvor abgerufene Zweig möglicherweise lokal angezeigt. Siehe:

$ git branch -a
[...]
release
remotes/origin/release
[...]

Sie haben nur die "Freigabe" entfernt, nicht jedoch "Fernbedienungen / Herkunft / Freigabe". Löschen Sie es wie folgt:

$ git branch -rd origin/release

Oder entfernen Sie alle abgerufenen Zweige, die auf der entfernten Seite nicht mehr existieren:

$ git remote prune origin 

Vielen Dank. In git branch -rd origin/release, was heißt -rdas? Bedeutet -ddasselbe wie -D? Kann git branch -rd origin/releasedurch ersetzt werden git branch -d remotes/origin/release?
Tim

@ Tim: Aus dem Handbuch; -r: List or delete (if used with -d) the remote-tracking branches.; -D:Shortcut for --delete --force.
Looper

Vielen Dank. Kann git branch -rd origin/releasedurch ersetzt werden git branch -d remotes/origin/release?
Tim

@Tim -rbezieht sich nicht auf entfernte Zweige, es wird benötigt. Die lokalen und entfernten Zweige werden in verschiedenen Verzeichnissen gespeichert, vergleichen ls -l .git/refs/headsund ls -l .git/refs/remotes. Sie könnten auch eine lokale Zweigstelle haben , remotes/origin/releasedie ohne gelöscht werden würde -r. Das mag verwirrend klingen, aber Sie könnten einfach herumspielen, Zweige mit seltsamen Namen erstellen und nachsehen, wie es aussieht .git/.
Rudimeier

15

Wenn Zweige aus der Ferne gelöscht werden, müssen Sie Ihr lokales Repository bereinigen. Am einfachsten ist dies mit

git fetch -p

Dadurch wird Ihr lokales Repository mit allen am Remote-Repository vorgenommenen Änderungen aktualisiert, ohne dass jedoch eine Ihrer lokalen Niederlassungen aktualisiert wird. Nachdem dies ausgeführt wurde,

git branch --remote

zeigt den gelöschten entfernten Zweig nicht mehr an.

Git-Repositorys sind vollständig, egal ob auf Ihrem eigenen System oder auf dem Server. Wenn Sie also zum ersten Mal ein Repository klonen, erhalten Sie eine vollständige Kopie, und Ihr lokaler Git „kennt“ alle Remote-Zweige sowie Ihre lokalen Zweige. Diese Informationen werden nicht automatisch synchronisiert. Als Ihr Kollege den releaseZweig auf dem Server löschte , verlor Ihr lokales Git-Repository nicht die Vorstellung eines entfernten releaseZweigs. Durch die Synchronisierung mit werden git fetchalle lokalen Informationen in Remotezweigen so aktualisiert, dass sie mit dem Status auf dem Server übereinstimmen (genau genommen, Remote-Repository, wo auch immer), ohne jedoch lokale Informationen in Remotezweigen zu löschen. Beim Bereinigen mit git fetch -p(oder git fetch --pruneoder git remote prune) werden die lokalen Informationen zu entfernten Zweigen entfernt, die gelöscht wurden.


Vielen Dank. "Aktualisieren Sie Ihr lokales Repository mit allen am Remote-Repository vorgenommenen Änderungen, ohne jedoch eine Ihrer lokalen Niederlassungen zu aktualisieren". Was ist das für ein Update, da es sich nicht um ein Update meiner lokalen Filialen handelt?
Tim

Es sind alle Remote-Updates. Ihr lokales Git-Repository unterscheidet Ihre lokalen Zweige von den entfernten Zweigen, aber entfernte Zweige sind nicht magisch mit dem Server synchronisiert - sie existieren auch lokal (wie in Ihrem lokalen Git-Repository). Durch das Abrufen wird Ihr lokales Repository mit dem Remote-Repository synchronisiert und der Status der Remote-Zweige aktualisiert. Standardmäßig werden gelöschte entfernte Zweige nicht aus den lokalen Informationen entfernt, -p( --prune) erzwingt dies.
Stephen Kitt

Vielen Dank. Warum wurde der releaseZweig nicht gelöscht, git branch -D releasebevor git checkout releasemake git checkout releaseden releaseZweig nicht mehr abrief ?
Tim

1
Denn git checkout releaseerstellt einen Zweig automatisch neu, wenn es einen entfernten Zweig mit diesem Namen gibt.
Stephen Kitt

Mit "entfernter Zweig" meinen Sie einen Zweig in meinem lokalen Repository oder Github-Repository? Falls zuvor, git branch -D releasehat der releaseZweig in meinem lokalen Repository bereits gelöscht . In letzterem Fall hat ein Mitarbeiter den releaseZweig auf GitHub gelöscht . Ich bin mir also immer noch nicht sicher, warum "ein Zweig automatisch neu erstellt wird, wenn es einen entfernten Zweig mit diesem Namen gibt"?
Tim

3

Tim: Git ist ein verteiltes VCS. Wenn Sie also ein Repo von Remote auf Ihr lokales klonen, klont es alles (Verlauf). Als Sie also Ihr Repo geklont haben, gab es einen Zweig namens release. Da Ihr Kollege die Freigabe-Verzweigung remote git fetch -pgelöscht hat, wird Ihre lokale Verzweigung diese Verzweigung haben , bis Sie eine Bereinigung vornehmen oder diese Verzweigung explizit löschen.


3
Wie unterscheidet sich diese Antwort von den bereits vorhandenen?
Stephen Rauch

1

Vielleicht ein bisschen tangential, aber die Perspektive dieser Site könnte helfen, das allgemeine Thema des Löschens von Zweigen zu verstehen:

http://railsware.com/blog/2014/08/11/git-housekeeping-tutorial-clean-up-outdated-branches-in-local-and-remote-repositories/

Es gibt Überschneidungen mit einigen der hier bereits besprochenen Themen, aber der Fokus liegt auf der Haushaltsführung: Löschen von Zweigstellen, die nicht mehr in einer kollaborativen Umgebung benötigt werden. Insbesondere git branch --mergedidentifiziert der Befehl Zweige, die sicher gelöscht werden können, weil sie mit Ihrer Hauptlinie (oder einem anderen Zweig, den Sie interessieren) zusammengeführt werden. Wenn Sie zusammenarbeiten, werden einige schicke Mini-Skripte wie dieses die Dinge in einem schönen, verdaulichen Format mit Datumsangaben und Autoren präsentieren.

for branch in `comm -12  <(git branch --merged|awk '{print($1)}') <(git branch -r --merged|awk '{print($1)}'|awk -F \/ '{print($2)}')`; do echo -e `git show --format="%ci %cr %an" $branch | head -n 1` \\t$branch; done | sort -r

(Leider bezieht sich "nett, verdaulich" nicht auf die Formatierung der Skripte selbst.)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.