Почему “origin / HEAD” отображается при запуске “git branch -r”?
-
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
эд? HEAD
s передвигаться по кругу...почему меня волнует, что у кого-то 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