Nota prima che la tua domanda mostra un po 'di incomprensioni. origin / HEAD rappresenta il ramo predefinito sul telecomando , ovvero HEAD che si trova nel repository remoto che stai chiamando origin. Quando cambi ramo nel tuo repository, non lo stai influenzando. Lo stesso vale per i rami remoti; potresti avere master
e origin/master
nel tuo repository, dove origin/master
rappresenta una copia locale del master
ramo nel repository remoto.
origin's HEAD cambierà solo se tu o qualcun altro lo cambi effettivamente nel repository remoto , cosa che praticamente non dovrebbe mai accadere - vuoi che il ramo predefinito un repository pubblico rimanga costante, sul ramo stabile (probabilmente master). origin / HEAD è un riferimento locale che rappresenta una copia locale di HEAD nel repository remoto. (Il suo nome completo è refs / remotes / origin / HEAD.)
Penso che quanto sopra risponda a ciò che realmente volevi sapere, ma per andare avanti e rispondere alla domanda che hai esplicitamente posto ... origin / HEAD viene impostato automaticamente quando cloni un repository, e questo è tutto. Stranamente, non è impostato da comandi come git remote update
: credo che l'unico modo in cui cambierà è se lo cambi manualmente. (Per cambio intendo indicare un ramo diverso; ovviamente il commit indica cambiamenti se quel ramo cambia, cosa che potrebbe accadere al recupero / pull / aggiornamento remoto.)
Modifica : il problema discusso di seguito è stato corretto in Git 1.8.4.3 ; vedi questo aggiornamento .
C'è un piccolo avvertimento, però. HEAD è un riferimento simbolico, che punta a un ramo anziché direttamente a un commit, ma i protocolli di trasferimento remoto git riportano solo commit per ref. Quindi Git conosce lo SHA1 del commit indicato da HEAD e da tutti gli altri riferimenti; deve quindi dedurre il valore di HEAD trovando un ramo che punta allo stesso commit. Ciò significa che se due rami sembrano puntare lì, è ambiguo. (Credo che scelga il master, se possibile, quindi ritorni al primo in ordine alfabetico.) Vedrai questo riportato nell'output di 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
Stranamente, sebbene l'idea di HEAD stampata in questo modo cambierà se le cose cambiano sul telecomando (ad esempio se il foo viene rimosso), in realtà non si aggiorna refs/remotes/origin/HEAD
. Questo può portare a situazioni davvero strane. Diciamo che nell'esempio sopra origin / HEAD in realtà indicavano foo, e quindi il ramo foo di origin è stato rimosso. Possiamo quindi fare questo:
$ 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)
Quindi, anche se lo spettacolo remoto sa che HEAD è il maestro, non aggiorna nulla. Il ramo foo viziata viene correttamente potata, e testa diventa penzoloni (indicando un ramo inesistente), e ancora non aggiorni per puntare a master. Se si desidera risolvere questo problema, utilizzare git remote set-head origin -a
, che determina automaticamente HEAD di origine come sopra, quindi imposta origin / HEAD in modo che punti al ramo remoto appropriato.
refs/origin/HEAD
. Non si tratta di comeHEAD
viene impostato il riferimento simbolico proprio di un repository .