Git-тег не на ветке

Я клонировал репо комаров изhttps://github.com/eclipse/mosquitto, Содержит тегv1.4.9, Однако это не похоже на то, чтобы быть на ветке.

Как это могло случиться? Сохраняет ли автор на самом деле ветку в своем репо, а только выталкивает теги из этой ветки в github? Или он просто делает коммит на тег?

Я превратил тег в местную ветку:

$ git checkout -b work149 v1.4.9

И посмотрел последний коммит на ветке:

$ git log -1
commit 91bfd82491f90e24b6fe9c036f0b04a1f5c14a89
Merge: bf959ef 2d0af73
Author: Roger A. Light <[email protected]>
Date:   Thu Jun 2 22:05:34 2016 +0100

    Merge branch 'fixes'

Этот коммит на один больше чемfixes ветка.

Или сgit log --graph Я вижу более ранний коммит на той же ветке (неfixes ветка, но ветку я пытаюсь понять)

* |   commit bf959ef9b0ae0e4d74bf80158ffb0b7c69da533d
|\ \  Merge: 646e0a0 5cca6b4
| |/  Author: Roger A. Light <[email protected]>
| |   Date:   Sun Feb 14 14:38:42 2016 +0000
| |
| |       Merge branch 'fixes'
| |

Как вы узнаете, есть ли тег на ветви и на какой ветви? Указывает ли самая левая вертикальная полоса на ветку и где эта ветка на пульте?

Это обычная практика?

Отобсуждение темы "Git pull не получает теги" упоминаетbranch heads that are being tracked а такжеnon-commits, Интересно,git clone commend помещает клон, чтобы не отслеживать все ветви на удаленном компьютере, или репозиторий каким-то образом превратил теги в некоммиты?

 minghua07 июн. 2016 г., 00:11
В частности, как вы создаете тег, которого нет ни в одной ветви, и помещаете этот тег в github? Как теги версионируются и отслеживаются?
 jub0bs06 июн. 2016 г., 22:46
Тэги и ветви - это просто указатели на коммиты,с разной семантикой, Тег не обязательно должен совпадать с веткой.
 torek07 июн. 2016 г., 00:35
Теги не версионированы. Как сказал Джубобс, это всего лишь разновидность названий ветвей. В частности, Git использует общую форму, называемую «ссылка»: ссылка - это просто имя, которое преобразуется в хэш-идентификатор (обычно идентификатор фиксации). Ветвь - это ссылка, которая перемещается особым образом, а тег - это ссылка, которая никогда не перемещается (и может использовать вспомогательный объект «аннотированный тег» для указания на фиксацию). Перейдите по ссылке Джубобса, приведенной в его комментарии.

Ответы на вопрос(2)

я собирался выпустить новую версию, я зафиксировал все на своем ПК и добавил тег.

Тогда я сделалgit push --tagsошибочно полагая, что это подтолкнет основную ветвьа также тег Затем я создал релиз на github. Релиз указывал на последние изменения, но основная ветвь осталась позади. Я должен был толкнуть снова, и это все выровняло.

Примечательным является то, что все файлы были фактически переданы первой командой (я видел это по выводу, вы знаете: создание дельт и т. Д.). Во втором нажатии переданные байты сообщили 0, так что, я думаю, были выдвинуты только метаданные ветви.

Решение Вопроса

91bfd82491fпометил, что зафиксировал, нажал метку, а затем удалил ветку. Вы также правы, что у автора может быть локальная ветвь, которая указывает на тот же коммит, но выдвигает только тег, а не ветвь.

Проверьте, какая ветвь или ветви содержатv1.4.9 с помощью

git branch -a --contains v1.4.9

Выполнение этой команды не дает вывода, что подтверждает, что она не находится на своей собственной ветви. В отличие от этого, ищитеv1.4.8:

$ git branch -a --contains v1.4.8
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/debian
  remotes/origin/master

Один из способов напрямую создать теговый коммит вне любой ветви - это работать сОТДЕЛЬНАЯ ГОЛОВАвот гдеHEAD не относится к именованной ветви. В клоне комаров, вы можете добраться туда, запустив

git checkout v1.4.9

который дает вам болтливое предупреждение.

Note: checking out 'v1.4.9'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at 91bfd82... Merge branch 'fixes'

На этом этапе git создаст больше коммитов. Например:

$ touch look-ma-no-branch ; git add look-ma-no-branch

$ git commit -m 'Look, Ma! No branch!'
[detached HEAD 51a0ac2] Look, Ma! No branch!
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 look-ma-no-branch

Этот новый коммит51a0ac2 не существует ни в одной ветке, что мы можем подтвердить.

$ git branch -a --contains 51a0ac2
* (HEAD detached from v1.4.9)

Ради интереса, давайте пометим это тоже.

git tag -a -m 'Tag branchless commit' v1.4.9.1

Возвращаясь кmaster ветвь сgit checkout master, мы можем использоватьgit lola (псевдоним дляgit log --graph --decorate --pretty=oneline --abbrev-commit --all) чтобы увидеть, что новый тег похож на своего предшественника.

$ git lola
* 51a0ac2 (tag: v1.4.9.1) Look, Ma! No branch!
*   91bfd82 (tag: v1.4.9) Merge branch 'fixes'
|\
| | * 1cd4092 (origin/fixes) [184] Don't attempt to install docs when WITH_DOCS=no.
| | * 63416e6 ;
| | * 5d96c3d [186] Fix TLS operation with websockets listeners and libwebsockts 2.x.
| |/
| * 2d0af73 Bump version number.
| | *   8ee1ad8 (origin/coverity-fixes) Merge branch 'fixes' into coverity-fixes
[...]

Подтвердите, что он существует ни на одной ветке, используя

git branch -a --contains v1.4.9.1

Поскольку вы спросили, нет, это совсем не обычный рабочий процесс git.

 minghua07 июн. 2016 г., 04:22
Ах, круто! Я также догадался, что автор пометил ветку, затем удалил ветку, а затем нажал только метку. Но это выглядело слишком много лишних шагов только для того, чтобы запутать других людей. Приятно знать, что это не обычная практика.

Ваш ответ на вопрос