2016-06-06 4 views
1

Я клонировал реку москитов от https://github.com/eclipse/mosquitto. Он содержит тег v1.4.9. Однако это не похоже на ветку.a git tag не на ветке

Как это могло случиться? Действительно ли автор сохраняет ветку на своем собственном репо, но только отталкивает теги от этой ветки до 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' 
| | 

Как вы выяснить, является ли тег на ветке и на какой ветке? В левой вертикальной полосе указана ветка и где находится ветвь на пульте дистанционного управления?

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

От a discussion thread about "Git pull doesn't get the tags" упоминается branch heads that are being tracked и non-commits. Интересно, оправдывает ли git clone клон, чтобы не отслеживать все ветви на пульте дистанционного управления, или репо каким-то образом сделало теги не обязательными?

+1

Теги и ветви - это просто указатели на фиксации, [с другой семантикой] (http://stackoverflow.com/questions/1457103/how-is-a-tag-different-from-a-branch-which-should- я-потребительной здесь). Тег не обязательно должен совпадать с веткой. – Jubobs

+0

В частности, как вы создаете тег, который не находится в какой-либо ветке, и нажимаете этот тег на github? Как выполняются теги и отслеживаются теги? – minghua

+1

Теги не версируются. Как сказал Джубобс, это всего лишь разновидность имен филиалов. Более конкретно, Git использует общую форму, называемую «ссылкой»: ссылка - это просто имя, которое разрешает идентификатор хэша (обычно идентификатор фиксации). Ветвь - это ссылка, которая перемещается определенным образом, а тег - ссылка, которая никогда не перемещается (и может использовать вспомогательный объект «аннотированный тег» для указания на фиксацию). Следуйте по ссылке, предоставленной Jubobs в его комментарии. – torek

ответ

5

Я думаю, что у автора, вероятно, была ветка, содержавшая 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 

Один способ непосредственно создать помеченный совершить за пределами какой-либо ветви, чтобы работать с detached HEAD, то есть где 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 

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

+0

А, Удивительный! Я также догадался, что автор отметил ветку, затем удалил ветку, а затем нажал только тег. Но это выглядело слишком много дополнительных шагов только для того, чтобы запутать других людей. Хорошо знать, что это не обычная практика. – minghua

3

Я сделал что-то подобное по ошибке: я собирался нажать новый релиз, я совершил все на своем ПК и добавил тег.

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

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

Смежные вопросы