Почему “origin / HEAD” отображается при запуске “git branch -r”?

StackOverflow https://stackoverflow.com/questions/354312

  •  21-08-2019
  •  | 
  •  

Вопрос

Когда ты бежишь git branch -r какого черта в нем перечисляется origin/HEAD?Например, на GitHub есть удаленное репозиторий, скажем, с двумя ветвями:мастер и потрясающая функция.Если я это сделаю git clone чтобы захватить его, а затем перейти в мой новый каталог и перечислить ветви, я вижу это:

$ git branch -r
origin/HEAD
origin/master
origin/awesome-feature

Или в каком бы порядке это ни было (альфа?Я подделываю этот пример, чтобы сохранить личность невинного репо в секрете).Так что же это за HEAD бизнес?Это то, что последний человек, который push имели свои HEAD указывал на то, когда они толкали?Разве это не будет всегда, чем бы это ни было, они pushэд? HEADs передвигаться по кругу...почему меня волнует, что у кого-то HEAD указал на другую машину?

Я только начинаю разбираться с удаленным отслеживанием и тому подобным, так что это одна из затяжных путаниц.Спасибо!

Редактировать:У меня сложилось впечатление, что выделенные удаленные репозитории (например, GitHub, где никто не будет входить по ssh и работать над этим кодом, а только извлекать или нажимать и т.д.) Не имели и не должны были иметь HEAD, потому что, по сути, не было рабочей копии.Не так ли?

Это было полезно?

Решение

@робинст является правильным.

В git вы можете выбрать, какая ветвь извлекается по умолчанию (т.е.когда вы клонируете).По умолчанию, origin/HEAD укажет на это.

На GitHub, Вы можете изменить это в настройках администратора вашего репозитория GitHub.Вы также можете сделать это из командной строки через

git remote set-head origin trunk

или полностью удалите его с помощью

git remote set-head origin -d

Пример.Посмотрите на раскрывающийся список "Переключить ветви". trunk проверяется, так что origin/HEAD следует trunk.

Другие советы

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

Обычно HEAD указывает на master , и это ветвь, которая извлекается, когда люди клонируют репозиторий.Установка его в другую ветвь (путем редактирования HEAD в голом репозитории) приводит к тому, что эта ветвь извлекается при clone.

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

У меня было точно такое же впечатление, как вы сказали.

И я даже не могу удалить эту ветку удаленного отслеживания origin / HEAD, клонированную с github, выполнив

git branch -d -r origin/HEAD

Это не возымело никакого эффекта.

Может ли кто-нибудь сказать мне, как я могу удалить эту ветку удаленного отслеживания origin / HEAD?

Обновить

Хотя я не нашел, почему при клонировании с github создается origin / HEAD, я нахожу способ удалить его.

Новая версия git предоставляет

git remote set-head <name> -d

чтобы удалить бесполезный ГОЛОВНОЙ указатель ветви удаленного отслеживания.

И мы также можем изменить тупое имя по умолчанию 'origin' на любое, какое захотим, используя

git remote rename origin <new_name>

Надеюсь, это может помочь.:)

Вы правы в том, что подталкивая к выделенные удаленные репозитории работают намного лучше, когда они "голые", то есть когда у них нет рабочих каталогов.Архитектура Git предназначена для обновления с помощью патчей или pull (fetch), что имеет смысл в распределенной VCS.Как где-то говорится в документах, переход к ветке, которая в данный момент извлечена, может привести к "неожиданные результаты".

Заголовок является частью требований к действующему репозиторию. Макет репозитория Git говорит, частично:

HEAD

A symref (see glossary) to the refs/heads/ namespace describing the currently active  
branch. It does not mean much if the repository is not associated with any working tree  
(i.e. a bare repository), but a valid git repository must have the HEAD file; some  
porcelains may use it to guess the designated "default" branch of the repository  
(usually master). It is legal if the named branch name does not (yet) exist.

Таким образом, вы будете видеть HEAD как часть списка ветвей, даже если "это мало что значит ..."

Если "origin" является удаленным репозиторием, то origin/HEAD идентифицирует ветвь по умолчанию в этом удаленном репозитории.

Пример:

$ git remote show
origin
$ git remote show origin
* remote origin
  Fetch URL: git@github.com:walkerh/pipe-o-matic.git
  Push  URL: git@github.com:walkerh/pipe-o-matic.git
  HEAD branch: master
  Remote branch:
    master tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (fast-forwardable)

Обратите внимание на строку с надписью "ГОЛОВНОЙ филиал:мастер".Именно здесь удаленный репозиторий позволяет клиентам узнать, какую ветвь следует проверить по умолчанию.

Всегда есть ГОЛОВА, которая Очки к текущей извлеченной ветке удаленного репозитория (которая может быть, а может и не быть главной).Даже удаленные репозитории имеют текущие ветви.Обычно это master, и навскидку я не могу придумать ни одной причины, по которой кто-то захотел бы это изменить, но это можно изменить.

Я предполагаю, что кто-то толкнул ветку и назвал ее ГОЛОВОЙ:

git push origin HEAD
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top