Спочатку зауважте, що у вашому запитанні є трохи непорозумінь. origin / HEAD представляє гілку за замовчуванням на віддаленому пристрої , тобто HEAD, який знаходиться у тому віддаленому сховищі, яке ви викликаєте походженням. Коли ви перемикаєте гілки в репо, ви на це не впливаєте. Те саме стосується віддалених відділень; у вас може бути masterі origin/masterу вашому репо, де origin/masterпредставлена локальна копія masterгілки у віддаленому сховищі.
origin HEAD зміниться лише в тому випадку, якщо ви або хтось інший насправді змінить його у віддаленому сховищі , що в основному ніколи не трапиться - ви хочете, щоб гілка за замовчуванням публічна репо залишалася постійною, на стабільній гілці (можливо, майстер). origin / HEAD - локальний номер, що представляє локальну копію HEAD у віддаленому сховищі. (Повна його назва - refs / remotes / origin / HEAD.)
Я думаю, що вище відповідає на те, що ви насправді хотіли знати, але продовжувати і відповідати на запитання, яке ви прямо задали ... походження / HEAD встановлюється автоматично, коли ви клонуєте сховище, і це стосується цього. Як не дивно, що він не встановлений такими командами, git remote update- я вважаю, що єдиний спосіб зміниться - це якщо ви вручну зміните його. (Під зміною я маю на увазі іншу гілку; очевидно, що вона вказує на зміни, якщо ця гілка зміниться, що може статися під час отримання / потягу / віддаленого оновлення.)
Редагувати : Проблема, обговорена нижче, була виправлена в Git 1.8.4.3 ; переглянути це оновлення .
Хоча є крихітний застереження. HEAD - це символічний перегляд, який вказує на гілку замість безпосередньо на фіксацію, але протоколи віддаленої передачі git передають лише звіт про відкликання. Таким чином, Git знає SHA1 зобов’язання, на яке вказує HEAD, та всіх інших посилань; Потім він повинен вивести значення HEAD, знайшовши гілку, яка вказує на ту саму комісію. Це означає, що якщо трапляються дві гілки, то це неоднозначно. (Я вважаю, що він забирає майстер, якщо це можливо, потім повертається до першого алфавіту.) Ви побачите це, про що повідомляється у висновку git remote show origin:
$ git remote show origin
* remote origin
Fetch URL: ...
Push URL: ...
HEAD branch (remote HEAD is ambiguous, may be one of the following):
foo
master
Як не дивно, хоча поняття HEAD, надруковане таким чином, зміниться, якщо все зміниться на пульті дистанційного управління (наприклад, якщо foo буде видалено), воно фактично не оновиться refs/remotes/origin/HEAD. Це може призвести до дійсно дивних ситуацій. Скажіть, що у наведеному вище прикладі походження / HEAD насправді вказувало на foo, а відділення foo початку було видалено. Тоді ми можемо зробити це:
$ git remote show origin
...
HEAD branch: master
$ git symbolic-ref refs/remotes/origin/HEAD
refs/remotes/origin/foo
$ git remote update --prune origin
Fetching origin
x [deleted] (none) -> origin/foo
(refs/remotes/origin/HEAD has become dangling)
Тож хоча віддалене шоу знає, що HEAD є господарем, воно нічого не оновлює. Відстояну гілку foo правильно обрізають, і HEAD стає звисаючим (вказує на неіснуючу гілку), і вона все ще не оновлює її, щоб вказати на майстер. Якщо ви хочете виправити це, використовуйте git remote set-head origin -a, що автоматично визначає HEAD начала як вище, а потім фактично встановлює origin / HEAD, щоб вказати на відповідну віддалену гілку.
refs/origin/HEAD. Йдеться не про те, як встановлюється власне символічне посилання сховищаHEAD.