(Ця відповідь потребувала певного часу, а відповідь codeWizard правильна за ціллю та сутністю, але не зовсім повна, тому я все-таки опублікую цю інформацію.)
Не існує такого поняття, як "віддалений тег Git". Є лише "теги". Я вказую все це не бути педантичним, 1 , а тому що є велика плутанина з цього приводу з випадковими користувачами Git, і документація Git не дуже корисно 2 для початківців. (Не зрозуміло, чи виникає плутанина через погану документацію, або неякісна документація, тому що це по суті дещо заплутано, чи що.)
Там є «віддалені гілки», більш правильно називають «дистанційне відстеження гілок», але варто відзначити , що це на самому справі місцеві організації. Однак немає віддалених тегів (якщо ви (пере) їх не вигадали). Є лише локальні теги, тому вам потрібно отримати тег локально, щоб ним користуватися.
Загальна форма для імен для конкретних комісій - на яку Git називає посилання - це будь-який рядок, починаючи з refs/
. Рядок, який починається з refs/heads/
імені гілки; рядок, що починається з refs/remotes/
імені відділення віддаленого відстеження; і рядок, що починається з refs/tags/
імен тегу. Назва refs/stash
- посилання на скриньку (як використовується git stash
; зверніть увагу на відсутність останньої косої риски).
Є деякі незвичайні імена для особливих випадків , які не починаються з refs/
: HEAD
, ORIG_HEAD
, MERGE_HEAD
, і , CHERRY_PICK_HEAD
зокрема , все також імена , які можуть ставитися до конкретних фіксації (хоча HEAD
зазвичай містить назву філії, тобто містить ). Але загалом посилання починаються з цього .ref: refs/heads/branch
refs/
Одне, що робить Git, щоб зробити це заплутаним, це те, що він дозволяє опускати refs/
слово, а часто і слово після refs/
. Наприклад, ви можете опустити refs/heads/
або refs/tags/
при посиланні на локальну гілку або тег, а насправді ви повинні пропустити refs/heads/
під час перевірки місцевої гілки! Ви можете це робити, коли результат однозначний, або - як ми недавно відмітили - коли ви повинні це зробити (для ).git checkout branch
Це правда, що посилання існують не тільки у вашому власному сховищі, але і у віддалених сховищах. Однак Git надає вам доступ до посилань на віддалений репозиторій лише у дуже конкретний час: а саме під час fetch
та під час push
операцій. Ви також можете використовувати git ls-remote
або git remote show
побачити їх, але fetch
і push
є більш цікаві точки дотику.
Рефлекси
Під час fetch
і push
Git використовує рядки, які викликає refspecs для передачі посилань між локальним та віддаленим сховищем. Таким чином, саме в цей час і за допомогою refspecs два сховища Git можуть синхронізуватися між собою. Коли ваші імена синхронізуються, ви можете використовувати те саме ім’я, яке використовує хтось із віддаленого пристрою. fetch
Хоча тут є якась особлива магія , і вона впливає як на назви гілок, так і назви тегів.
Вам слід подумати про те git fetch
, щоб спрямувати свій Git на виклик (або, можливо, текстове повідомлення) іншого Git - "віддаленого" - і вести розмову з ним. На початку цієї розмови пульт перелічує всі його посилання: усе, що є, refs/heads/
і все , що міститься refs/tags/
, а також будь-які інші посилання на нього. Ваш Git сканує ці (і базується на звичайній перспективі вибору) перейменує їх гілки.
Давайте подивимось на нормальну характеристику віддаленого імені origin
:
$ git config --get-all remote.origin.fetch
+refs/heads/*:refs/remotes/origin/*
$
Цей респект вказує вашому Git приймати будь-яке ім'я, яке відповідає ( refs/heads/*
наприклад, кожну гілку на пульті), і змінювати його ім'я на refs/remotes/origin/*
, тобто зберігати відповідна частина однаковою, змінюючи ім'я гілки ( refs/heads/
) на ім'я гілки віддаленого відстеження ( refs/remotes/
зокрема , refs/remotes/origin/
).
Саме через цю refspec , що origin
гілки «S стати вашими дистанційного відстеження гілок для віддаленого origin
. Назва гілки стає назвою відділення для віддаленого відстеження, при цьому ім'я віддаленого, у цьому випадку origin
, включене. Знак "плюс" +
в передній частині рефлексу встановлює прапор "сила", тобто ваша гілка дистанційного відстеження буде оновлена відповідно до назви гілки віддаленого відділення, незалежно від того, що потрібно для того, щоб воно відповідало. (Без +
оновлення філій обмежуються змінами "швидкого перемотування вперед", а оновлення тегів просто ігноруються, оскільки версія Git 1.8.2 або більше - до цього застосовуються ті самі правила швидкого перемотування.)
Теги
А як щодо тегів? Для них немає жодної перспективи - принаймні, не за замовчуванням. Ви можете встановити його, і в цьому випадку залежність від форми відображення залежить від вас; або ти можеш бігати git fetch --tags
. Використання --tags
впливає на додавання refs/tags/*:refs/tags/*
до refspec, тобто воно надсилає всі теги ( але не оновлює ваш тег, якщо у вас уже є тег із цим іменем, незалежно від того, що говорить тег дистанційного керування Edit, січень 2017: станом на Git 2.10 , тестування показує, що --tags
примусово оновлює ваші теги з тегів віддаленого пристрою, як ніби читається респект +refs/tags/*:refs/tags/*
; це може бути різниця в поведінці від попередньої версії Git).
Зверніть увагу, що перейменування тут немає: якщо у віддаленому origin
є тег xyzzy
, а ви цього не зробите, і git fetch origin "refs/tags/*:refs/tags/*"
ви потрапляєте refs/tags/xyzzy
до вашого сховища (вказуючи на те саме, що і на віддаленому). Якщо ви використовуєте, +refs/tags/*:refs/tags/*
то ваш тег xyzzy
, якщо він у вас є, замінюється на тег з origin
. Тобто, +
прапор сили на refspec означає "замінити значення моєї посилання на те, яке мій Git отримує від їх Git".
Автоматичні теги під час отримання
З історичних причин 3, якщо не використовується ні --tags
опція, ні --no-tags
опція, git fetch
вживаються спеціальні дії. Пам'ятайте, що ми говорили вище, що пульт починається з показу вашому локальному Git усіх його посилань, хочете, щоб ваш місцевий Git бачив їх чи ні. 4 Ваш Git приймає до уваги всі теги, які він бачить у цей момент. Потім, коли він починає завантажувати будь-які об'єкти фіксації, йому потрібно обробляти все, що відбувається, якщо одна з цих комісій має той самий ідентифікатор, що і будь-який із цих тегів, git додасть цей тег - або ті теги, якщо кілька тегів мають цей ідентифікатор - ваше сховище.
Редагувати, січень 2017: тестування показує, що поведінка в Git 2.10 зараз є: Якщо їх Git надає тег з назвою T , а у вас немає тегу з іменем T , а ідентифікатор комісії, пов’язаний з T, є родоначальником однієї з їх гілок що ваш git fetch
досліджує, ваш Git додає T у ваші теги з або без --tags
. Додавання --tags
змушує ваш Git отримати всі їх теги, а також змусити оновити.
Нижня лінія
Можливо, вам доведеться використовувати їх, git fetch --tags
щоб отримати їх теги. Якщо їхні імена тегів суперечать вашим існуючим іменам тегів, вам, можливо, доведеться (навіть залежно від версії Git) видалити (або перейменувати) деякі свої теги, а потім запустити git fetch --tags
, щоб отримати їх теги. Оскільки теги, на відміну від віддалених гілок, не мають автоматичного перейменування, імена тегів повинні відповідати їхнім іменам тегів, тому у вас можуть виникнути проблеми з конфліктами.
Однак у більшості звичайних випадків простий git fetch
виконає роботу, переносячи їхні коміти та відповідні теги, і оскільки вони - хто б вони не були - позначають свої зобов’язання під час публікації цих комісій, ви будете в курсі їх тегів. Якщо ви не створите власних тегів і не змішаєте їх сховище та інші сховища (за допомогою декількох віддалених пристроїв), у вас також не буде зіткнень імен тегів, тому вам не доведеться метушитися зі видаленням або перейменуванням тегів, щоб отримати їх теги.
Коли вам потрібні кваліфіковані імена
Я вже згадував вище , що ви можете опустити refs/
майже завжди, і refs/heads/
та refs/tags/
і так далі більшу частину часу. Але коли ти не можеш?
Повний (або майже повний в будь-якому випадку) відповідь в в gitrevisions
документації . Git вирішить ім'я ідентифікатора комісії за допомогою шестиступеневої послідовності, наведеної у посиланні. Цікаво, що теги переосмислюють гілки: якщо є тег xyzzy
і гілка xyzzy
, і вони вказують на різні коміти, то:
git rev-parse xyzzy
дасть вам ідентифікатор, на який вказує тег. Однак - і цього не вистачає gitrevisions
- git checkout
віддає перевагу іменам гілок, тому git checkout xyzzy
ви поставите вас на гілку, нехтуючи тегом.
У разі неоднозначності ви можете майже завжди прописати ім'я посилання, використовуючи його повне ім’я, refs/heads/xyzzy
або refs/tags/xyzzy
. (Зверніть увагу , що це робить роботу з git checkout
, але в можливо несподіваним чином: git checkout refs/heads/xyzzy
викликає отдельностоящую-ГОЛОВУ перевірку , а не галузева перевірки Ось чому ви просто повинні відзначити , що. git checkout
Буде використовувати коротку назву в якості імені гілки першого: ось як ти перевірити гілку, xyzzy
навіть якщо тег xyzzy
існує. Якщо ви хочете перевірити тег, можете скористатися refs/tags/xyzzy
.)
Оскільки (як gitrevisions
зазначає) Git спробує , ви також можете просто написати, щоб визначити фіксований тег . (Якщо комусь вдалося написати дійсну посилання, названу на ім'я , це вирішить як . Але зазвичай повинні міститись лише різні імена .)refs/name
tags/xyzzy
xyzzy
xyzzy
$GIT_DIR
$GIT_DIR/xyzzy
*HEAD
$GIT_DIR
1 Добре, добре, "не просто бути педантичним". :-)
2 Дехто сказав би, що "не дуже корисний", і я, як правило, погоджуюся.
3 В основному, git fetch
і вся концепція віддалених та рефлексів була трохи пізнім доповненням до Git, що відбувалося за часів Git 1.5. До цього були лише окремі спеціальні випадки, і видобуток тегів був одним із них, тому він отримав грандіозне зібрання за допомогою спеціального коду.
4 Якщо це допомагає, подумайте про віддалений Git як про спалах , в сленговому значенні.
git checkout A
. що такеA
? Як ви створилиA
?