Warum Git den Doppelpunkt (: <branch>) verwendet, um den Remote-Zweig zu löschen

81

Warum benutzt Git

git push <remote> :<branch>

wie in

git push origin :featureA

den Zweig featureAvom Remote-Server löschen ?

Mich interessiert, warum der Doppelpunkt als Löschflag verwendet wurde.

Es ist so anders als git branch -d <localbranch>.

Warum machen wir so etwas nicht?

git branch -d --remote origin <branchname>

oder gibt es eine tiefere Bedeutung hinter dem Doppelpunktsymbol, die ich nicht kannte?

Skalopus
quelle
3
Für die Remote - Filialen zu löschen, gibt es jetzt eine schönere Syntaxgit push origin --delete foobar
quetzalcoatl

Antworten:

91

Es ist nicht die Bedeutung des :Per se, sondern was vorhanden ist oder eher davor fehlt.

Das refspec-Format ist

<+><source>:<destination>

(optional + für nicht schnellen Vorlauf)

Wenn Sie also so etwas tun git push origin :featureA, geben Sie eine leere Quellreferenz an und machen das Ziel im Grunde "leer" oder löschen es.

PS: Beachten Sie, dass die Referenz :oder nichts nicht bedeutet, nichts zu nichts zu schieben. Es macht git, "passende" Zweige zu pushen: Für jeden Zweig, der auf der lokalen Seite existiert, wird die entfernte Seite aktualisiert, wenn auf der entfernten Seite bereits ein Zweig mit demselben Namen existiert.

Manojlds
quelle
4
Git> = 1.7.0 hinzugefügt git push origin -d <branch>, git push origin -D <branch>um einen Remote-Zweig zu löschen und das Löschen zu erzwingen.
Robsn
Wann würden Sie etwas vor das stellen :?
ITIA
@ITIA, wenn Ihre lokale Niederlassung einen anderen Namen als die entfernte hat.
Listerreg
20

Der Doppelpunkt ist keine "Löschflagge". Beachten Sie, dass sowohl Git Push als auch Git Pull null oder mehr Refspecs als letzte Argumente akzeptieren. Lesen Sie jetzt über Refspecs . Ein Doppelpunkt trennt die Quelle vom Ziel in einer Referenz. Der Befehl git push origin :foohat eine leere Quelle und sagt im Wesentlichen "Push nichts, um foo des Ursprungs zu verzweigen" oder mit anderen Worten, "Zweig foo am Ursprung nicht existieren lassen".

Ryan Stewart
quelle
IMO, Ihre Antwort beantwortet die Frage aus folgendem Grund nicht: Wenn ich versuche, einen Zweig zu verschieben, dessen Verlauf auseinander gegangen ist, muss ich den Zweig erzwingen. Dies ist jedoch nicht der Fall, wenn Sie einen Zweig mit löschen :foo. Ein leerer Zweig teilt den Verlauf nicht mit einem vorhandenen Remote-Zweig und kann daher meines Erachtens einen vorhandenen Remote-Zweig nicht mit einem leeren Zweig überschreiben. Mit Ihrer Antwort stimmt etwas nicht.
Umang
3
@Umang: afaik, es ist nur eine konzeptionelle Sache, und ich habe nicht gesagt "einen leeren Zweig schieben". Ich sagte "Push nichts". Ich bin nicht anderer Meinung als Ihre Einschätzung, dass es sinnvoller wäre, ein "+" davor zu haben, aber genau so funktioniert es. Lesen Sie den letzten Abschnitt des von mir geposteten Refspecs-Links und entscheiden Sie, ob Sie dem Autor vertrauen.
Ryan Stewart
Ich glaube, ich verstehe jetzt etwas besser. Vielen Dank!
Umang