Perché viene visualizzato “origin / HEAD” quando si esegue “git branch -r”?


160

Quando corri git branch -rperché il blaze è elencato origin/HEAD? Ad esempio, c'è un repository remoto su GitHub, diciamo, con due rami: master e funzionalità impressionante. Se lo faccio git cloneper afferrarlo e poi andare nella mia nuova directory ed elencare i rami, vedo questo:

$ git branch -r
origin/HEAD
origin/master
origin/awesome-feature

O in qualunque ordine sarebbe (alfa? Sto falsificando questo esempio per mantenere segreta l'identità di un innocente repo repo). Quindi qual è il HEADbusiness? È l'ultima persona a cui è pushstato HEADindicato quando hanno spinto? Non sarà sempre quello che erano push? HEADs muoversi ... perché mi interessa cosa qualcuno ha HEADindicato su un'altra macchina?

Sto solo prendendo confidenza con il monitoraggio remoto e simili, quindi questa è una confusione persistente. Grazie!

EDIT: Avevo l'impressione che i repository remoti dedicati (come GitHub in cui nessuno si immergesse e lavorasse su quel codice, ma solo pull o push, ecc.) Non avevano e non dovevano avere un HEAD perché, fondamentalmente, c'era nessuna copia funzionante. Non così?


Risposte:


140

@robinst è corretto.

In git, puoi selezionare quale ramo è estratto per impostazione predefinita (cioè quando cloni). Di default,origin/HEAD indicherà quello.

Su GitHub, puoi modificarlo nelle impostazioni di amministrazione per il tuo repository GitHub. Puoi anche farlo dalla riga di comando tramite

git remote set-head origin trunk

o eliminalo del tutto tramite

git remote set-head origin -d

Esempio . Guarda il menu a discesa "Cambia rami". trunkè selezionato, quindi origin/HEADsegue trunk.


Ho ribattezzato un altro telecomando origine il mio otherremote/HEAD -> mastermi dava fastidio. L'esecuzione del comando ha risolto questo problema per me.
Felipe Alvarez,

59

Il motivo per cui un repository nudo può avere un HEAD è perché determina quale ramo viene estratto inizialmente dopo un clone del repository.

Normalmente, HEAD punta a padroneggiare, e questo è il ramo che viene verificato quando le persone clonano il repository. Impostandolo su un altro ramo (modificando HEAD nel repository nudo), quel ramo viene estratto su clone.


2
Poiché è possibile rimuovere questo riferimento senza premere, origin/HEADun riferimento locale è corretto? La rimozione ha qualche effetto su origin?
Zach Posten,

@zposten: No, allo stesso modo in cui l'eliminazione origin/masternon influisce sul telecomando.
Robininst

Ciò significherebbe che dopo la clonazione il riferimento è solo un'informazione inutile.
Bachsau,

@Bachsau il riferimento non viene clonato.
Robinin

27

Avevo l'impressione che i repository remoti dedicati (come GitHub in cui nessuno si immergesse e lavorasse su quel codice, ma solo pull o push, ecc.) Non avevano e non avrebbero dovuto avere un HEAD perché sostanzialmente non funzionava copia. Non così?

Ho avuto la stessa identica impressione che hai detto.

E non riesco nemmeno a eliminare quel ramo di tracciamento remoto origine / HEAD clonato da Github facendo

git branch -d -r origin/HEAD

Questo non ha avuto effetto.

Qualcuno può dirmi come posso eliminare quel ramo di tracciamento remoto origine / HEAD?

aggiornare

Anche se non ho trovato il motivo per cui è stata creata un'origine / HEAD durante il clone da github, trovo un modo per eliminarlo.

La nuova versione di git fornisce

git remote set-head <name> -d

per eliminare il puntatore HEAD inutile del ramo di tracciamento remoto.

E possiamo anche cambiare il nome predefinito stupido 'origine' con quello che vogliamo usando

git remote rename origin <new_name>

Spero che questo possa aiutare. :)


Sto riscontrando lo stesso problema (anche su GitHub) e il set-head non ha funzionato. Dovrei eseguire 'git remote set-head HEAD -d'?
Joost Schuur,

5
@Joost: ègit remote set-head origin -d
znq

13

Hai ragione a dire che spingendo verso repository remoti dedicati funziona molto meglio quando sono "nudi", cioè quando non hanno directory funzionanti. L'architettura di Git è progettata per l'aggiornamento tramite patch o pull( fetch), il che ha senso in un VCS distribuito. Come dicono i documenti da qualche parte, spingendo verso un ramo che è attualmente estratto può portare a "risultati imprevisti" .

HEAD fa parte dei requisiti per un repository valido. Git Repository Layout dice, in parte:

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.

Quindi vedrai HEAD come parte dell'elenco delle filiali, anche se "non significa molto ..."


Questo non ha senso. I repository iniziano nudi ma nel momento in cui si preme qualcosa su di essi, non sono più nudi e se si esegue "git branch" su di essi mostreranno un ramo attualmente estratto.
geoidesic,

@geoidesic Un repository potrebbe essere nudo anche se lo hai inviato. Quanto segue: mkdir foobar; cd foobar; git init --bare; cd ..; git clone foobar foobar_clone; cd foobar_clone; touch file; git add file; git config --global user.email "you@example.com"; git config --global user.name "Your Name"; git commit -m "test"; git push origin master; cd ..; cd foobar; git config core.bareoutput true. Inoltre non esiste una copia funzionante del file push nel repository foobar su tali comandi.
Anders Lindén,

@geoidesic Un repository potrebbe essere nudo anche se lo hai inviato. Quanto segue: mkdir foobar; cd foobar; git init --bare; cd ..; git clone foobar foobar_clone; cd foobar_clone; touch file; git add file; git config user.email "you@example.com"; git config user.name "Your Name"; git commit -m "test"; git push origin master; cd ..; cd foobar; git config core.bareoutput true. Inoltre non esiste una copia funzionante del file push nel repository foobar su tali comandi.
Anders Lindén,

@geoidesic Un repository gb --bare significa solo un repository senza albero funzionante, ovvero un repository che contiene solo una directory .git, ma non può avere alcun file estratto. Dal momento che non può avere alcun file estratto, in realtà non ha nemmeno una directory .git, mette semplicemente tutti i file .git direttamente nella directory principale. Creane uno e vedrai!
00prometheus

5

Se "origin" è un repository remoto, origin / HEAD identifica il ramo predefinito su quel repository remoto.

Esempio:

$ 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)

Nota la riga che dice "HEAD branch: master". È qui che il repository remoto consente ai client di sapere quale ramo eseguire il checkout per impostazione predefinita.


1

C'è sempre un HEAD che punta al ramo attualmente estratto sul repository remoto (che può essere o meno master). Anche i repository remoti hanno rami correnti. Di solito è un maestro, e dalla cima della mia testa non riesco a pensare a nessun motivo per cui uno vorrebbe cambiarlo, ma può essere cambiato.


2
i repository github non hanno verificato i rami. Non vedo perché questo si applicherebbe.
Dustin,

I repository remoti NON devono avere una directory di lavoro. I repository remoti dovrebbero essere --bare e quindi non possono avere un ramo attualmente estratto.
n4rzul,

-14

La mia ipotesi è che qualcuno abbia spinto un ramo e lo abbia chiamato HEAD:

git push origin HEAD

Posso ottenere alcuni commenti su cosa c'è che non va in questo? Se vuoi un'origine / HEAD su github, questo è l'unico modo che conosco per arrivarci.
Dustin,

HEAD remoto è un riferimento simbolico (di solito a refs / head / master). Sostituirai il riferimento simbolico con l'id hash del commit del tuo ramo corrente.
Daniel Fanjul,

2
Le ipotesi non dovrebbero essere discusse nei commenti invece di essere una risposta imprecisa?
Luciano,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.