git checkout аннотированное поведение тегов - PullRequest
0 голосов
/ 13 мая 2018

Проходя переименование тегов, я узнал, что аннотированные теги сами являются объектами, имеющими собственные идентификаторы SHA1. ЗДЕСЬ

Я также знаю, как git checkout разрешает их ссылки. ЗДЕСЬ

Если $ GIT_DIR / существует, это то, что вы имеете в виду (обычно это полезно только для HEAD, FETCH_HEAD, ORIG_HEAD, MERGE_HEAD и CHERRY_PICK_HEAD);

в противном случае, ссылки /, если они существуют;

в противном случае refs / tags /, если он существует;

в противном случае, ссылки / заголовки /, если они существуют;

в противном случае, refs / remotes /, если он существует;

в противном случае, refs / remotes // HEAD, если он существует.

Теперь мой вопрос: когда я делаю git checkout some_annotated_tag_name или даже git checkout SHA1_ID_OF_ANNOTATED_TAG, он переключает мой HEAD на коммит, на который указывает аннотированный тег, а не на объект аннотированного тега.

В чем причина этого? Если я упоминаю какой-нибудь идентификатор SHA1, он должен привести меня к этому идентификатору SHA1?

РЕДАКТИРОВАТЬ: допустим, мое аннотированное имя тега annot. Это SHA1 216a2ee6ef4276566081c6dc1ee853bfd1798829, а SHA1 коммита, на который он указывает, a8b21d7a46903e90d08338fd0311e2ead8d86eac.

Теперь давайте посмотрим, какой результат мы получим.

git checkout annot

Выход:

Note: checking out 'annot'.

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 a8b21d7... 3rd

git checkout 216a2ee6ef4276566081c6dc1ee853bfd1798829

Выход:

Note: checking out '216a2ee6ef4276566081c6dc1ee853bfd1798829'.

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 a8b21d7... 3rd

1 Ответ

0 голосов
/ 13 мая 2018

В документе также говорится, что HEAD names the commit on which you based the changes in the working tree.HEAD может указывать на ветвь или конкретный коммит, и в конечном счете он указывает на коммит, потому что ветвь всегда указывает на коммит.Единственным исключением является нерожденная ветвь.Когда мы создадим новый репозиторий по git init, мы обнаружим, что содержимое .git/HEAD равно ref: refs/heads/master.На данный момент master - это нерожденная ветвь, которая ожидает первого коммита, а HEAD - еще не верная ревизия.В конце концов, HEAD как действительная ревизия всегда указывает на объект фиксации.

В отличие от облегченного тега, у аннотированного тега есть свой собственный объект, такой как фиксация.Оба тега могут указывать на любой из четырех типов объектов Git, commit, tag, blob и tree, хотя в большинстве случаев они указывают на коммиты.Если HEAD указывает на тег, а тег указывает на большой двоичный объект, то HEAD не может быть разрешен как коммит, что противоречит запланированному использованию HEAD.Так что HEAD не может указывать на объект тега в первую очередь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...