Differenza tra HEAD e master


189

Qual è la differenza tra HEADe masterin Git?

Ho fatto un clone di un progetto su GitHub e voglio inviare le mie modifiche al telecomando. Ma a quale dovrei spingere?

immagine dello schermo

Risposte:


162

masterè un riferimento alla fine di un ramo. Per convenzione (e per impostazione predefinita) questo è di solito il ramo di integrazione principale, ma non deve esserlo.

HEADè in realtà un tipo speciale di riferimento che punta a un altro riferimento. Potrebbe indicare master o meno (indicherà il ramo attualmente estratto). Se sai di voler impegnarti nella masterfiliale, spingi a questo.

Ecco un esempio visivo:

testo alternativo

Sul tuo repository puoi controllare dove HEADsta puntando eseguendo questo:

$ git symbolic-ref HEAD
refs/heads/master

Tuttavia, scoprire dove remotes/origin/HEADsta puntando è più complicato perché si trova sul computer remoto.

C'è un piccolo tutorial sui riferimenti git qui:

http://people.gnome.org/~federico/news-2008-11.html#pushing-and-pulling-with-git-1


1
+1 Risposta più precisa della mia. Vedi anche stackoverflow.com/questions/3301956/… e stackoverflow.com/questions/3301956/… per le illustrazioni relative a tali concetti.
VonC,

37

La semplice risposta è che HEADè un puntatore / etichetta al commit più recente del ramo in cui ci si trova attualmente. masterè il ramo predefinito creato quando hai inizializzato un repository git (ad es git init.).

È possibile eliminare il masterramo (ad es git branch -D master.). Non è possibile eliminare il HEADpuntatore.


6
" HEADè un puntatore / etichetta per il commit più recente del ramo in cui ci si trova attualmente." Penso che questo sia fuorviante nella migliore delle ipotesi. Se esegui il checkout di un commit precedente, HEAD ora è un puntatore a quel commit precedente, non al commit più recente. Destra?
LarsH

2
Hai ragione. HEAD è il tuo ultimo checkout. Ma a mia difesa, per Git, il checkoutcomando equivale a cambiare ramo in altri sistemi SCM comuni.
Benhorgen,

1
Sono d'accordo ... avrei potuto facilmente fare lo stesso errore. L'unica ragione che ho notato è perché sono nella fase di cercare di capire cosa significhi realmente HEAD. Qualche possibilità che tu possa modificare la tua risposta per essere corretta? Trovo che HEAD sia un concetto difficile da trovare descrizioni accurate di, per i non esperti come me. E avere consigli seduti là fuori sul web che fornisce informazioni errate su HEAD lo rende un po 'più difficile.
LarsH

2
Penso che il tuo commento sia un chiarimento fantastico per chiunque cerchi una comprensione più precisa di ciò HEADche è veramente il puntatore Git . Apprezzo il tuo commento e penso che lo faranno anche gli altri. Il contenuto del mio post originale e il tuo commento di follow-up si completano a vicenda. Grazie.
Benhorgen,

4
Un tecnicismo, ma se si esegue il checkout di un commit precedente, non si è più "attivi" in una filiale. Se effettui il checkout di un commit anziché di un ramo, hai quello che viene chiamato "HEAD distaccato", non sei più "su un ramo". Essere "su un ramo" significa che HEAD fa riferimento a un ramo e per definizione sei sul commit più recente di quel ramo. Solo perché hai eseguito il check-out 'b54fe7' e il master punta a quel commit, non significa che sei nel ramo principale. Potrebbero esserci diversi rami che puntano allo stesso commit, sei "su" quello a cui punta HEAD, se presente.
Jason Goemaat,

8

Spingi semplicemente le modifiche del tuo ramo attuale

git push origin

e spingerà il tuo ramo ' B' cambia in ' origin/B'.
Se sei sul tuo masterramo, git spingerà a origin/master.
In realtà spingerà tutte le modifiche sui rami locali che hanno rami remoti corrispondenti in origin. È controllato dall'impostazione di configurazione push.default .
Vedi anche spingere RefSpecs nel libro Pro Git .


Quello che vedi è la barra laterale che rappresenta tutti i refspec del tuo repository remoto nel fork Experimental GitX del progetto GitX .

testo alternativo

Il HEADdesignerà il ramo predefinito per quel telecomando.
Vedi la git remote set-headpagina man :

Non è necessario disporre di un ramo predefinito per un telecomando, ma consente di specificare il nome del telecomando al posto di un ramo specifico.
Ad esempio, se il ramo predefinito per originè impostato su master, è originpossibile specificare dove normalmente si specifica origin/master.

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.