У меня есть ветка, настроенная для отслеживания ссылки в источнике. git checkout <branchname>
переключается на эту ветвь, и a git status
покажет мне, насколько далеко впереди или позади моя ветка от источника, но я удивлен, что origin/HEAD
все еще указывает на origin/master
, а неorigin/<branchname>
Итак, мой вопрос: при каких обстоятельствах происходит перемещение origin / HEAD?
РЕДАКТИРОВАТЬ:
Я ценю ответы о том, как переместить origin / HEAD, но меня интересует, что «органически» перемещает его, помимо того, что я явно говорю ему это сделать.
Например, когда я переключаю ветки, git указывает HEAD на ветку, которую я проверяю, поэтому я удивлен, что origin / HEAD не перемещается таким же образом.
refs/origin/HEAD
. Дело не в том, как устанавливается собственная символическая ссылка репозиторияHEAD
.Ответы:
Во-первых, обратите внимание, что ваш вопрос свидетельствует о некотором недопонимании. origin / HEAD представляет ветвь по умолчанию на удаленном компьютере , то есть HEAD, который находится в том удаленном репозитории, который вы вызываете origin. Когда вы переключаете ветки в своем репо, вы не влияете на это. То же самое и с удаленными филиалами; у вас может быть
master
иorigin/master
в вашем репо, гдеorigin/master
представляет собой локальную копиюmaster
ветки в удаленном репозитории.HEAD origin будет изменяться только в том случае, если вы или кто-то другой действительно измените его в удаленном репозитории , что в принципе никогда не должно происходить - вы хотите, чтобы ветка по умолчанию в общедоступном репо оставалась постоянной в стабильной ветке (возможно, главной). origin / HEAD - это локальная ссылка, представляющая локальную копию HEAD в удаленном репозитории. (Его полное имя - refs / remotes / origin / HEAD.)
Я думаю, что приведенное выше отвечает на то, что вы действительно хотели знать, но, чтобы продолжить и ответить на вопрос, который вы явно задали ... origin / HEAD устанавливается автоматически, когда вы клонируете репозиторий, и это все. Как ни странно, он не задается такими командами, как
git remote update
- я считаю, что единственный способ его изменить - это изменить его вручную. (Под изменением я подразумеваю указание на другую ветку; очевидно, что фиксация указывает на изменения, если эта ветка изменяется, что может произойти при извлечении / извлечении / удаленном обновлении.)Изменить : проблема, описанная ниже, была исправлена в Git 1.8.4.3 ; см. это обновление .
Однако есть небольшая оговорка. HEAD - это символическая ссылка, указывающая на ветку, а не непосредственно на фиксацию, но протоколы удаленной передачи git сообщают только фиксации для ссылок. Итак, Git знает SHA1 коммита, на который указывает HEAD и все остальные ссылки; Затем он должен определить значение HEAD, найдя ветку, которая указывает на ту же фиксацию. Это означает, что если две ветви указывают туда, это неоднозначно. (Я считаю, что он выбирает мастер, если это возможно, а затем возвращается к первому в алфавитном порядке.) Вы увидите, что это сообщается в выводе
git remote show origin
:Как ни странно, хотя понятие HEAD, напечатанного таким образом, изменится, если что-то изменится на пульте дистанционного управления (например, если foo будет удален), на самом деле оно не обновляется
refs/remotes/origin/HEAD
. Это может привести к очень странным ситуациям. Скажем, в приведенном выше примере origin / HEAD фактически указывает на foo, а затем ветка foo origin была удалена. Затем мы можем сделать это:Таким образом, даже если удаленное шоу знает, что HEAD является ведущим, оно ничего не обновляет. Устаревшая ветка foo правильно обрезана, а HEAD становится висящим (указывая на несуществующую ветку), но по- прежнему не обновляет ее, чтобы указать на master. Если вы хотите исправить это, используйте
git remote set-head origin -a
, который автоматически определяет HEAD источника, как указано выше, а затем фактически устанавливает origin / HEAD для указания на соответствующую удаленную ветку.источник
git remote set-head origin -a
сделал работу за меняЭто ваша настройка как владельца вашего локального репо. Измените это так:
И origin / HEAD будет указывать на вашу ветку вместо master. Тогда это будет относиться только к вашему репо, а не к другим. По умолчанию он будет указывать на master, если в удаленном репо не настроено что-то еще.
Хорошую информацию по этому поводу дает ручной ввод для удаленной установочной головки .
Изменить: подчеркнуть: без вашего ведома, единственный способ «переместить» - это переименование основной ветки , которая, как мне кажется, не считается «органической». Итак, я бы сказал, что органически он не движется.
источник
Что движет origin / HEAD «органично»?
git clone
устанавливает его один раз в то место, где HEAD находится в исходной точкеgit clone
Что представляет собой HEAD по происхождению?
git clone
использует его таким образомЧто устанавливает origin / HEAD?
git clone
выбирает и устанавливает этоgit fetch
обновлять его, как и любую другую ссылку, но это неgit remote set-head origin -a
выбирает и устанавливает этоМелочи
origin/HEAD
также можно установить любое другое значение, не обращаясь к пульту дистанционного управления:git remote set-head origin <branch>
источник
origin/HEAD
и ваше решение помогло. Благодарность!git fetch
его обновлением, так как он позволяет настроить (локальный) ярлык. Цитата из документа: «Наличие ветки по умолчанию для удаленного устройства не требуется, но позволяет указать имя удаленного устройства вместо конкретной ветки». Было бы странно, если бы удаленное изменение обновляло локально настроенные ярлыки.origin/HEAD
- плохая репутация. И то,git clone
что по умолчанию для «локально настроенной ветки» используется удаленное имя, это тоже противоречит этому. В репозиториях non-bare даже нет смысла использовать удаленный токHEAD
.Отказ от ответственности : это обновление ответа Джефроми , которое я пишу, чтобы сэкономить время любопытным.
Я тщетно пытался воспроизвести (в Git 2.0.1)
remote HEAD is ambiguous
сообщение, которое Джефроми упоминает в своем ответе; поэтому я немного покопался (клонировав https://github.com/git/git и выполнив поиск в журнале). Раньше было так(Коммит
4229f1fa325870d6b24fe2a4c7d2ed5f14c6f771
от 27 февраля 2009 г., обнаружен сgit log --reverse --grep="HEAD is ambiguous"
)Однако с тех пор обсуждаемая двусмысленность снята :
(Коммит
9196a2f8bd46d36a285bdfa03b4540ed3f01f671
от 8 ноября 2013 г., обнаружен сgit log --grep="ambiguous" --grep="HEAD" --all-match
)Изменить (спасибо torek ):
Это означает, что если вы используете Git v1.8.4.3 или новее , вы не должны столкнуться с какой-либо проблемой неоднозначного удаленного HEAD.
источник
Помните, что мы говорим о двух независимых репозиториях git. Ваше локальное репо с вашим кодом и удаленное управление где-то еще.
Вы правы, когда вы меняете ветку, HEAD указывает на вашу текущую ветку. Все это происходит в вашем локальном репозитории git. Не удаленное репо, которое может принадлежать другому разработчику, или размещаться на сервере в вашем офисе, или github, или другом каталоге в файловой системе, и т. Д.
Ваш компьютер (локальное репо) не имеет права изменять указатель HEAD на удаленном репозитории git. Например, он может принадлежать другому разработчику.
Еще одна вещь, то, что ваш компьютер называет origin / XXX, - это понимание вашим компьютером состояния пульта дистанционного управления во время последней выборки.
Так что же «органично» обновить origin / HEAD? Это будет активность в удаленном репозитории git. Не ваше местное репо.
Люди упомянули
Обычно это используется, когда на сервере есть общий центральный репозиторий git для использования командой разработчиков. Это будет команда, выполняемая на удаленном компьютере. Вы увидите это как активность в удаленном репозитории git.
источник
Выполните следующие команды из git CLI:
источник