Почему «origin / HEAD» отображается при запуске «git branch -r»? - PullRequest
142 голосов
/ 10 декабря 2008

Когда вы запускаете 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 на другой машине?

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

РЕДАКТИРОВАТЬ: у меня сложилось впечатление, что выделенные удаленные репозитории (такие как GitHub, где никто не будет работать с ssh и работать с этим кодом, а только вытащить или нажать и т. Д.) Не имели и не должны иметь HEAD, поскольку В принципе, нет рабочей копии. Не так ли?

Ответы [ 7 ]

127 голосов
/ 27 июля 2011

@ robinst правильно.

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

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

git remote set-head origin trunk

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

git remote set-head origin -d

Пример . Посмотрите на выпадающий список «Switch Branches». trunk проверено, поэтому origin/HEAD следует trunk.

56 голосов
/ 21 мая 2010

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

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

23 голосов
/ 30 июля 2009

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

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

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

git branch -d -r origin/HEAD

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

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

обновление

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

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

git remote set-head <name> -d

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

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

git remote rename origin <new_name>

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

13 голосов
/ 10 декабря 2008

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

HEAD является частью требований к действительному хранилищу. Git Repository Layout говорит, частично:

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 как часть списка ветвей, даже если «это не много значит ...»

3 голосов
/ 08 мая 2012

Если «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)

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

2 голосов
/ 10 декабря 2008

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

0 голосов
/ 10 декабря 2008

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

git push origin HEAD
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...