Najpierw zwróć uwagę, że Twoje pytanie zawiera pewne nieporozumienie. origin / HEAD reprezentuje domyślną gałąź na pilocie , tj. HEAD znajdujący się w tym zdalnym repozytorium, które nazywasz origin. Kiedy zmieniasz gałęzie w repozytorium, nie masz na to wpływu. To samo dotyczy zdalnych oddziałów; możesz mieć masteriw origin/masterswoim repozytorium, gdzie origin/masterreprezentuje lokalną kopię masteroddziału w zdalnym repozytorium.
origin's HEAD zmieni się tylko wtedy, gdy ty lub ktoś inny faktycznie zmieni go w zdalnym repozytorium , co w zasadzie nigdy nie powinno się zdarzyć - chcesz, aby domyślna gałąź repozytorium publicznego pozostała stała, na stabilnej gałęzi (prawdopodobnie master). origin / HEAD to lokalny odnośnik reprezentujący lokalną kopię HEAD w zdalnym repozytorium. (Jego pełna nazwa to refs / remotes / origin / HEAD.)
Myślę, że powyższe odpowiedzi są odpowiedzią na to, co tak naprawdę chciałeś wiedzieć, ale aby odpowiedzieć na pytanie, które wprost zadałeś ... pochodzenie / HEAD jest ustawiane automatycznie, gdy klonujesz repozytorium i to wszystko. Dziwne, że nie jest to ustawiane za pomocą poleceń takich jak git remote update- wierzę, że jedyny sposób, w jaki to się zmieni, to ręczna zmiana. (Przez zmianę rozumiem wskazanie innej gałęzi; oczywiście zatwierdzenie wskazuje na zmiany, jeśli ta gałąź się zmieni, co może się zdarzyć podczas pobierania / ściągania / zdalnej aktualizacji.)
Edycja : problem omówiony poniżej został poprawiony w Git 1.8.4.3 ; zobacz tę aktualizację .
Jest jednak małe zastrzeżenie. HEAD jest symbolicznym odnośnikiem, wskazującym na gałąź zamiast bezpośrednio do zatwierdzenia, ale protokoły zdalnego transferu git raportują tylko zatwierdzenia dla referencji. Więc Git zna SHA1 zatwierdzenia wskazanego przez HEAD i wszystkie inne referencje; następnie musi wydedukować wartość HEAD, znajdując gałąź, która wskazuje na to samo zatwierdzenie. Oznacza to, że jeśli dwie gałęzie wskazują na to, jest to niejednoznaczne. (Uważam, że jeśli to możliwe, wybiera mastera, a następnie wraca do pierwszego w kolejności alfabetycznej.) Zobaczysz to zgłoszone w wyniku 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
Co dziwne, chociaż pojęcie HEAD wydrukowane w ten sposób zmieni się, jeśli coś się zmieni na pilocie (np. Jeśli zostanie usunięte foo), w rzeczywistości nie aktualizuje się refs/remotes/origin/HEAD. Może to prowadzić do naprawdę dziwnych sytuacji. Powiedzmy, że w powyższym przykładzie origin / HEAD faktycznie wskazywał na foo, a gałąź foo pochodzenia została usunięta. Następnie możemy to zrobić:
$ 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)
Więc chociaż zdalny program wie, że HEAD jest mistrzem, niczego nie aktualizuje. Nieaktualna gałąź foo jest poprawnie przycinana, a HEAD zwisa (wskazując na nieistniejącą gałąź) i nadal nie aktualizuje jej, aby wskazywała na master. Jeśli chcesz to naprawić, użyj git remote set-head origin -a, który automatycznie określa HEAD źródła, jak powyżej, a następnie faktycznie ustawia początek / HEAD, aby wskazywały na odpowiednią gałąź zdalną.
refs/origin/HEAD. Nie chodzi o to, jakHEADustawia się własne symboliczne odniesienie repozytorium .