Есть два ключа к этому и hoppa has provided both, но позвольте мне посмотреть, могу ли я его немного сократить. (Это сложная задача для меня, так как я склонен писать очень длинные ответы. :-)) В любом случае я постараюсь прикрепить несколько вещей.
Во-первых, позвольте мне добавить, что git pull
просто удобство скрипт, который первым запускает git fetch
для вас, тогда в зависимости от конфигурации и дополнительные флаги спусков либо git merge
или git rebase
. (По умолчанию это делается для слияния, что для многих пользователей, как правило, неверно.)
(В вашем вопросе также отсутствует информация. Использование git pull
само по себе должно было привести к ошибке. Однако, если вы использовали git pull origin master
или аналогичный, вы должны были увидеть некоторый дополнительный вывод из git pull
, когда он сделал свой второй шаг. В любом случае мы можем видеть, что ваше окончательное состояние состоит в том, что HEAD
указывает на фиксацию слияния, хотя ни один из его родителей не является фиксацией что ваш тег идентифицирует.)
Когда вы указываете его тег, git checkout
ставит вас в состояние «отдельно стоящий ГОЛОВА». Это звучит немного страшно, как какая-то французская революция 18-го века, но на самом деле просто означает, что вы больше не в какой-либо отрасли. Git отлично работает в этом состоянии: вы можете совершать новые коммиты, включая слияния; они просто на нет филиалов. Единственный способ их найти - это сырой SHA-1, такой как 156f9e6b3fbfe7c16e8d821efd315428610043c2
, или некоторым относительным именем, начиная с HEAD
, например HEAD
, HEAD~1
, HEAD~2
и так далее.
Получив в «отдельностоящий HEAD» состояние, проверяя тег, то вы сделали по крайней мере, еще совершить один (на самом деле, по крайней мере, еще два на основе git show
продукции). Эти новые коммиты, как всегда, с отдельной головкой, вообще не имеют ветви. Последний был слиянием, предположительно с git merge
второй половины git pull
.
Теперь git status
показывает вам, где ваша голова: отдельно, не в тег, но из тега. Это означает, что вы были правы на ярлыке (в отдельном состоянии HEAD) раньше. Если бы вы запустить git status
прямо тогда, вы бы видели это:
$ git status
HEAD detached at daily-build-492
Сделав несколько новых фиксации (s) вы пошли в «сцепки с» вместо «отторгнуты в».
С другой стороны, команда git show
, так как hoppa already noted, показывает объект. Объект по умолчанию, который будет отображаться, если вы его не называете, - это любой объект HEAD
.В этом случае HEAD
называет коммит слиянием, поэтому отображает его идентификатор, идентификаторы его родителей (Merge: ec154d9 15e8876
), автора и дату, сообщение фиксации (которое выглядит как git pull
, поставляет на его этап git merge
) и комбинированный diff (пустой в этом случае).
Любопытно, что ни один из родителей не соответствует явному идентификатору помеченного фиксации, 609b538fb0180b170170be09312fecf5a5240b6a
. (Я говорю «очевидный» здесь, потому что вы использовали git rev-list -n 1
, а не git rev-parse daily-build-492^{commit}
, и, возможно, маловероятно, что после сортировки коммитов, которые будут перечислены, те, на которые указывает фактический тег, находятся дальше в выводе rev-list.) И, как я уже отмечал ранее, git pull
без дополнительных аргументов должен просто дать вам сообщение об ошибке.
(я думаю, что я потерпел неудачу в «короткий» :-), но, возможно, по крайней мере, это помогает выяснить, как вы попали в это состояние.)
Или действительно любой совершить идентификатор, а не краткое название ветки. Например, git checkout refs/heads/master
получает то же самое совершает как git checkout master
, но оставляет вас в состоянии «отдельно стоящего HEAD». (Если это то, что вы хотите, вы можете также использовать git checkout --detach master
, который я считаю более очевидным.)
Если вы git checkout
что-то еще, так что HEAD
теперь ссылается на какой-либо другой фиксации, вы остались только raw SHA-1, или же с некоторыми модификаторами. Например, 156f9e6~1
относится к первому родителю фиксации 156f9e6
, а 156f9e6~2
относится к первому родительскому объекту и т. Д.
(daily-build-492 == a tag, right?) Вы отделены от HEAD, потому что вы git checkout '. Вы уверены, что не хотите проверять филиал? Если вы проверяете тег, это означает, что индекс git застрял в предыдущем месте, но локальные файлы выгружаются, в зависимости от того, какие файлы выглядят в теге. Другое предположение: если вы хотите стоять на определенном теге, вы должны иметь возможность (предупреждение: деструктивная команда) 'git fetch --all && git reset --hard '). –
chelmertz
@chelmertz Да, я хочу именно этот «замороженный» код из тега. (В этом примере работает ежедневная известная сборка на сервере, она не является средой разработчиков.) Но, несмотря на это, интересный вопрос заключается в том, почему разные команды git не согласны. –
@torek @hoppa @chelmertz Я попытался сделать это без git pull. Различная диагностика, которую я упоминаю в ИС, является последовательной. Затем я вручную «git pull» просто посмотрел, что произойдет. Я получаю «Уже обновленный». И тогда диагностика остается неизменной. Таким образом, неясно, что «git pull» «испортил» ситуацию. Вопрос остается открытым. –