Чому Git використовує двокрапку (: <branch>) для видалення віддаленої гілки


81

Чому використовує Git

git push <remote> :<branch>

як і в

git push origin :featureA

видалити гілку featureAз віддаленого сервера?

Мене цікавить, чому двокрапка використовувалася як прапор видалення.

Це так відрізняється від git branch -d <localbranch>.

Чому б нам не зробити щось подібне

git branch -d --remote origin <branchname>

чи є за символом двокрапки глибший зміст, якого я не знав?


3
Для видалення віддалених гілок тепер є симпатичний git push origin --delete foobar
кращий

Відповіді:


91

Це не сенс сам :по собі, а те, що присутнє, а точніше відсутнє перед ним.

Формат refspec -

<+><source>:<destination>

(необов’язково + для нешвидкого перемотування вперед)

Отже, коли ви робите щось подібне git push origin :featureA, ви вказуєте порожній посилання на джерело і в основному робите пункт призначення "порожнім" або видаляєте його.

PS: Зверніть увагу, що refspec :або нічого не означає, що нічого не натискайте ні на що. Це робить git натисканням "відповідних" гілок: для кожної гілки, яка існує на локальній стороні, віддалена сторона оновлюється, якщо гілка з тим самим іменем вже існує на віддаленій стороні.


5
Git> = 1.7.0 додано git push origin -d <branch>для видалення та git push origin -D <branch>примусового видалення віддаленої гілки.
robsn

То коли б ви поставили щось перед:?
Itia

@ITIA, коли ваше місцеве відділення має іншу назву, ніж віддалене.
listerreg

20

Двокрапка не є "прапором видалення". Зверніть увагу, що і git push, і git pull приймають як остаточний аргумент нуль або більше рефспекцій. Тепер прочитайте про refspecs . Двокрапка виділяє джерело від пункту призначення в refspec. Команда git push origin :fooмає порожнє джерело і, по суті, говорить " нічого не натискати на розгалуження foo origin", або, іншими словами, "зробити гілку foo походження не існує".


IMO, ваша відповідь не відповідає на запитання з наступної причини: якщо я намагаюся підштовхнути гілку, історія якої розбіглася, мені потрібно змусити натиснути гілку. Однак це не так при видаленні гілки за допомогою :foo. Порожня гілка не ділиться історією з існуючою віддаленою гілкою, тому, як я бачу, вона не може перезаписати існуючу віддалену гілку порожньою гілкою. Щось відчуває себе неправильно з вашою відповіддю.
Уманг

3
@Umang: afaik, це лише концептуальна річ, і я не сказав "штовхнути порожню гілку". Я сказав "нічого не натискати". Я не погоджуюся з вашою оцінкою того, що було б більше сенсу перед знаком "+", але це саме так. Перегляньте останній розділ посилання, яке я опублікував, і вирішіть, чи довіряєте ви автору.
Ryan Stewart

Здається, я зараз трохи краще розумію. Дякую!
Уманг
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.