Dlaczego Git używa dwukropka (: <branch>) do usuwania zdalnej gałęzi

81

Dlaczego Git używa

git push <remote> :<branch>

jak w

git push origin :featureA

usunąć oddział featureA ze zdalnego serwera?

Interesuje mnie, dlaczego dwukropek został użyty jako flaga usuwania.

To jest tak różne od git branch -d <localbranch>.

Dlaczego nie zrobimy czegoś takiego

git branch -d --remote origin <branchname>

czy też jest głębsze znaczenie za symbolem okrężnicy, którego nie znałem?

skalopus
źródło
3
Do usuwania zdalnych oddziałów jest teraz ładniejsza składniagit push origin --delete foobar
quetzalcoatl

Odpowiedzi:

91

Nie chodzi o samo znaczenie :, ale o to, co jest przed nim obecne, a raczej nieobecne.

Format refspec to

<+><source>:<destination>

(opcjonalnie + dla bez szybkiego przewijania do przodu)

Więc kiedy robisz coś podobnego git push origin :featureA, podajesz pusty odnośnik źródłowy i zasadniczo ustawiasz miejsce docelowe jako „puste” lub usuwasz je.

PS: Zwróć uwagę, że refspec :lub nic nie oznacza, że ​​nic nie naciskasz. Powoduje, że git wypycha „pasujące” gałęzie: dla każdej gałęzi istniejącej po stronie lokalnej zdalna strona jest aktualizowana, jeśli gałąź o tej samej nazwie już istnieje po stronie zdalnej.

manojlds
źródło
5
Dodano Git> = 1.7.0 w git push origin -d <branch>celu usunięcia i git push origin -D <branch>wymuszenia usunięcia zdalnej gałęzi.
robsn
Kiedy więc umieściłbyś coś przed:?
ITIA,
@ITIA, gdy twój lokalny oddział ma inną nazwę niż zdalny.
listerreg
20

Dwukropek nie jest „flagą usuwania”. Zauważ, że zarówno git push, jak i git pull akceptują zero lub więcej refspecs jako końcowe argumenty. Teraz przeczytaj o refspecs . Dwukropek oddziela źródło od celu w refspec. Polecenie git push origin :fooma puste źródło i zasadniczo mówi „ nie wysyłaj nic do gałęzi foo pochodzenia” lub innymi słowy „spraw, aby gałąź foo na początku nie istniała”.

Ryan Stewart
źródło
IMO, twoja odpowiedź nie odpowiada na pytanie z następującego powodu: jeśli spróbuję pchnąć gałąź, której historia się rozeszła, muszę ją na siłę. Jednak nie dzieje się tak w przypadku usuwania gałęzi za pomocą :foo. Pusta gałąź nie współdzieli historii z istniejącą gałęzią zdalną, więc nie może, tak jak ja to widzę, nadpisać istniejącej gałęzi zdalnej pustą gałęzią. Coś jest nie tak z Twoją odpowiedzią.
Umang,
3
@Umang: afaik, to tylko kwestia koncepcyjna, a ja nie powiedziałem „wepchnij pustą gałąź”. Powiedziałem „nic nie pchaj”. Nie zgadzam się z twoją oceną, że bardziej sensowne byłoby umieszczenie przed nim znaku „+”, ale tak to po prostu działa. Zobacz ostatnią sekcję odnośnika refspecs, który zamieściłem, i zdecyduj, czy ufasz autorowi.
Ryan Stewart,
Myślę, że teraz rozumiem trochę lepiej. Dzięki!
Umang,