GIT head^ vs head~

di Lorenzo Neri

GIT head^ vs head~ che differenze ci sono fra le due istruzioni? In questo articolo lo scopriremo assieme oltre alle loro funzionalità all’interno del mondo dei repository GIT.

All’interno di un repository gestito con GIT, argomento che ho tratto ho in diversi articoli del blog, ti sarà capitato più volte di usare lo HEAD, quindi la testa per dirla in italiano che permette di muoversi all’interno del repository stesso.

Avrai notato, altrimenti non saresti qui, che si può usare in diversi modi: fra questi abbiamo sicuramente “HEAD^” e “HEAD~”.

Cerchiamo dunque di capire quali sono le differenze fra queste due modalità d’uso, ma prima permettimi di presentarmi.

Mi chiamo Lorenzo Neri e sono un informaticorealizzo contenuti per aiutare le persone a padroneggiare l’arte del nuovo millennio, ovvero l’informatica!

Questo articolo è nato come tanti altri a seguito di diverse situazioni lavorative della mia vita, soprattutto errori che ho commesso.

E quale miglior modo di fare tutto questo se non scrivendo gli articoli a cui hanno dato vita al blog?

Ciò detto, entriamo nel cuore di questo articolo!

Le differenze fra HEAD^ e HEAD~ quali sono?

Di primo acchito sembra che non ce ne siano, eppure ce ne sono due principali.

La tilde, la utilizziamo per tornare indietro di un certo numero di generazioni a seconda delle nostre esigenze.

Il cappelletto lo usiamo sui commit che hanno dato vita ad un merge. Questo, perché hanno due o più parenti vicini in termini di storia.

GIT head^ vs head~ la differenza è tutta nei parenti: partiamo dalla tilde

La frase di prima non è del tutto lineare, ma lo è l’utilizzo della tilde.

Per intenderci, la prima differenza è proprio questa: la tilde permette di tornare indietro di un certo numero di parenti in base a dove ci troviamo.

Dunque, non solo con HEAD ma anche con i branch.

Per intenderci, se attualmente sei “checkato” su master e ad un certo punto volessi tornare indietro di due commit, potresti eseguire banalmente:

git checkout master~2

Altrimenti, se vuoi usare direttamente HEAD (anche perché è di lei che stiamo parlando):

git checkout HEAD~2

In sintesi la tilde e il suo uso con HEAD ci permette quindi di posizionarci su qualsiasi parente in relazione ad HEAD o a qualunque branch.

Tutto molto bello, ma non ci dobbiamo dimenticare un pezzetto per strada.

Quando e come usare HEAD^

La storia di un repository non è mai lineare… NO beh… Diciamo che è raro. Tuttavia qui interviene l’uso del cappelletto.

Come funziona HEAD^ per intenderci?

Prima, abbiamo visto che la tilde ci permette di tornare indietro nella storia di un repository a prescindere da dove ci troviamo con HEAD o con uno specifico branch.

Prima però ho anche detto che il cappelletto torna comodo con quei commit che danno vita a dei merge.


Voglio offrirti una visione differente di questo concetto.

Prendiamo un commit che ha uno ED UN SOLO commit genitore.

In questo caso, usare “HEAD^” oppure “HEAD~” non fa alcuna differenza.

La differenza, salta fuori con quei commit che appunto danno vita a dei merge.

Ma vediamolo con un esempio.

      B     C
       \   /
        \ /
         A

Il commit “A” è genitore di entrambi i commit “B” e “C”.

E per sfruttare il checkout tramite l’operatore tilde e l’operatore cappelletto, i risultati possono essere un po’ differenti:

B = A^ = A^1 = A~1
C = A^2

Perché succede questo se di default il numero dopo l’operatore indicherebbe (nota il condizionale)il numero di salti indietro che dobbiamo fare?

Beh, perché in realtà con l’operatore cappelletto, il commit “C” è il secondo figlio.

Non ti è ancora chiaro?

Facciamo un secondo esempio!

  B   C   D
   \  |  / 
    \ | /   
     \|/    
      A 

In questo caso, rispetto ad “A”:

B = A^ = A^1 = A~1
C = A^2
D = A^3

Continua a scoprire di più con questi articoli!

Lascia un commento

Questo sito potrebbe fare uso di cookie e siccome l'UE mi obbliga a fartelo presente, eccoti il classico banner dove puoi decidere come gestirli. Accetta Leggi di più