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

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

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

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

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

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

Ответ 1

@robinst верен.

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

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

git remote set-head origin trunk

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

git remote set-head origin -d

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

Ответ 2

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

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

Ответ 3

У меня сложилось впечатление, что специализированные удаленные репозитории (например, GitHub где никто не будет работать и работать этот код, но только тянуть или нажимать и т.д.), не имел и не должен иметь ГОЛОВУ потому что в основном не было рабочая копия. Не так?

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

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

git branch -d -r origin/HEAD

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

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

Обновление

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

Новая версия git обеспечивает

git remote set-head <name> -d

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

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

git remote rename origin <new_name>

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

Ответ 4

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

HEAD является частью требований для действительного репозитория. 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 как часть списка ветвей, даже если "это не значит много..."

Ответ 5

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

Ответ 6

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

Пример:

$ git remote show
origin
$ git remote show origin
* remote origin
  Fetch URL: [email protected]:walkerh/pipe-o-matic.git
  Push  URL: [email protected]: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)

Обратите внимание на строку с надписью "HEAD branch: master". Здесь удаленный репозиторий позволяет клиентам узнать, какая ветка проверена по умолчанию.

Ответ 7

Я предполагаю, что кто-то нажал ветку и вызвал ее HEAD:

git push origin HEAD