Проверка тега git на самом деле делает другое

#git #git-tag

Вопрос:

Мне кажется странным такое поведение, у меня есть тег git, скажем, tag-a, когда я проверил его, выполнив следующее:

 git checkout tag-a
 

он проверяет тег-b

 user@server xxx ~/path/git-local-folder ((tag-b))
 

Я бы предположил, что существует какая-то связь между тегом-a и тегом-b, но я не знаю, что это такое и логика этого

Комментарии:

1. Указывают ли оба тега на одну и ту же фиксацию? Каков результат git status ?

2. Отделенная голова обычно означает, что вы работаете не в филиале. Вы не можете извлечь тег напрямую, так как это тег, а не ветвь. Чтобы создать ветвь, используйте -b имя ветви, которое следует создать при проверке тега.

3. да, но вы не сказали, как вы получили этот результат. (какой тег был создан ранее, сколько коммитов находится между этими тегами, существует ли коммит одного тега в иерархии коммитов другого тега?)

4. Вполне вероятно, что ваш код настройки запроса путается со статусом отсоединенной ГОЛОВЫ и печатает что-то поддельное. Где вы взяли код для настройки запроса?

5. @matt Вы бы проверили тег по той же причине, по которой вы его создали в первую очередь: потому что он ссылался на некоторую значительную ревизию репозитория, такую как выпущенная версия продукта. Это совершенно разумный поступок.

Ответ №1:

Команда «git checkout» имеет несколько режимов работы, которые она выбирает автоматически в зависимости от типа аргумента, который вы ей даете. Те, которые актуальны прямо сейчас, это:

  • Если вы дадите ему имя ветви, он обновит рабочее дерево и промежуточную область до текущей фиксации, на которую ссылается эта ветвь, и обновит маркер ЗАГОЛОВКА до имени этой ветви. Последующие операции, такие как «фиксация git», затем знают, что нужно переместить этот указатель ветви.
  • Если вы даете ему ссылку на фиксацию, отличную от имени ветви, он обновляет рабочее дерево и промежуточную область таким же образом, но не записывает имя ветви в качестве ЗАГОЛОВКА. Это называется «отсоединенной ГОЛОВКОЙ», и последующая «фиксация git» не приведет к перемещению указателя ветви. Имя тега попадает в эту категорию.

Обратите внимание, что более новая команда «git switch» заставляет вас явно проводить это различие: если аргумент не является именем ветви, он завершится ошибкой, если вы не укажете этот --detach параметр.

Теперь, когда ваше приглашение пытается отобразить текущую извлеченную ветвь, самое простое место для поиска-это головной файл. Но если вы находитесь в состоянии «отделенной ГОЛОВЫ», это будет просто содержать хэш фиксации, независимо от того, как вы выбрали эту фиксацию. Таким образом, код отображения должен выбрать что-то для отображения вместо названия филиала. Он может посмотреть, есть ли какие-либо теги, указывающие на текущий извлеченный коммит, но если на него указывает более одного тега, он не знает, какой из них вы использовали, и просто должен угадать.

В вашем случае «tag-a» и «tag-b» предположительно ссылаются на один и тот же коммит. Поэтому, как только вы проверите эту фиксацию, используемое вами приглашение будет искать тег и найдет «тег-b», даже если на самом деле вы набрали «тег-a» или даже хэш фиксации.