Qual è la differenza tra HEAD, albero di lavoro e indice, in Git?

Qualcuno può dirmi la differenza tra HEAD, albero di lavoro e indice, in Git?

Da quello che ho capito, sono tutti nomi di rami diversi. La mia ipotesi è corretta?


modificare

ho trovato questo

Un singolo repository git può tracciare un numero arbitrario di rami, ma il tuo albero di lavoro è associato a uno solo di essi (il ramo “corrente” o “ritirato”) e HEAD punta a quel ramo.

Ciò significa che HEAD e l’albero di lavoro sono sempre gli stessi?

Alcune altre buone referenze su questi argomenti:

  • My Git Workflow

alt text

Io uso l’indice come checkpoint .

Quando sto per apportare un cambiamento che potrebbe andare storto – quando voglio esplorare una direzione che non sono sicuro di poter seguire o se sia una buona idea, come un refactoring concettualmente esigente o la modifica di un tipo di rappresentazione – I checkpoint del mio lavoro nell’indice. Se questa è la prima modifica apportata dal mio ultimo commit, allora posso usare il repository locale come checkpoint, ma spesso ho una modifica concettuale che sto implementando come una serie di piccoli passi. Voglio controllare dopo ogni passaggio, ma salvare il commit fino a quando non sono tornato al codice funzionante e testato.

Gli appunti:

  1. lo spazio di lavoro è l’albero delle directory dei file (sorgente) che vedi e modifichi.

  2. L’ indice è un singolo, grande file binario in /.git/index , che elenca tutti i file nel ramo corrente, i loro checksum sha1 , timestamp e il nome del file – non è un’altra directory con una copia di file in esso.

  3. Il repository locale è una directory nascosta ( .git ) che include una directory di objects contenente tutte le versioni di ogni file nel repository (diramazioni locali e copie dei rami remoti) come un file “blob” compresso.

Non pensare ai quattro “dischi” rappresentati nell’immagine sopra come copie separate dei file pronti contro termine.

  • Perché Git è meglio di X

alt text

  • Git è il tuo amico non un nemico Vol. 3: Refs e indice

Sono fondamentalmente dei riferimenti con nome per commit Git. Ci sono due principali tipi di ref: tag e teste.

  • I tag sono riferimenti fissi che segnano un punto specifico nella cronologia, ad esempio v2.6.29.
  • Al contrario, le teste vengono sempre spostate per riflettere la posizione attuale dello sviluppo del progetto.

alt text

(nota: come commentato da Timo Huovinen , quelle frecce non sono ciò a cui il commit punta, è l’ ordine del stream di lavoro , fondamentalmente mostrando le frecce come 1 -> 2 -> 3 -> 4 dove 1 è il primo commit e 4 è l’ultimo)

Ora sappiamo cosa sta succedendo nel progetto.
Ma per sapere cosa sta succedendo proprio qui, in questo momento c’è un riferimento speciale chiamato HEAD. Serve a due scopi principali:

  • dice a Git che si impegna a prendere i file da quando fai il checkout, e
  • dice a Git dove inserire nuovi commit quando ti impegni.

Quando esegui git checkout ref , punta HEAD all’arbitro che hai designato ed estrae i file da esso. Quando si esegue git commit viene creato un nuovo object commit, che diventa figlio del corrente HEAD . Normalmente HEAD punta a una delle teste, quindi tutto funziona alla perfezione.

alt text

La differenza tra HEAD (ramo attuale o ultimo stato impegnato sul ramo corrente), indice (ovvero area di staging) e albero di lavoro (lo stato dei file nel checkout) è descritta nella sezione “The Three States” degli “1.3 Git Basics ” capitolo del libro Pro Git di Scott Chacon (licenza Creative Commons).

Ecco l’immagine che lo illustra da questo capitolo:

Operazioni locali: directory di lavoro e area di gestione temporanea (indice) vs repository git (HEAD)

Nell’immagine sopra la “directory di lavoro” è la stessa di “albero di lavoro”, la “zona di staging” è un nome alternativo per git “index”, e HEAD punta al ramo attualmente estratto, che punta punta all’ultimo commit nel ” git directory (repository) ”

Si noti che git commit -a dovrebbe mettere in scena le modifiche e commettere in un unico passaggio.

Il tuo albero di lavoro è ciò che è effettivamente nei file su cui stai lavorando attualmente. HEAD è un puntatore al ramo o effettua il commit dell’ultimo check-out e che sarà il genitore di un nuovo commit se lo fai. Ad esempio, se ti trovi nel ramo master , HEAD punta al master , e quando esegui il commit, quel nuovo commit sarà un discendente della revisione a cui il master punta, e il master verrà aggiornato per puntare al nuovo commit .

L’indice è un’area di gestione temporanea in cui viene preparato il nuovo commit. Essenzialmente, i contenuti dell’indice sono ciò che andrà nel nuovo commit (anche se se si esegue git commit -a , questo aggiungerà automaticamente tutte le modifiche ai file che Git conosce sull’indice prima di eseguire commit, quindi impegnerà i contenuti correnti del tuo albero di lavoro). git add aggiungerà o aggiornerà i file dall’albero di lavoro nel tuo indice.

Albero di lavoro

Il tuo albero di lavoro sono i file su cui stai lavorando attualmente.

Indice Git

  • Il git “index” è il punto in cui si collocano i file che si vogliono salvare nel repository git.

  • L’indice è anche noto come cache , cache di directory , cache di directory corrente , area di staging , file di staging .

  • Prima di “commit” (checkin) i file nel repository git, è necessario prima posizionare i file nel git “index”.

  • L’indice non è la directory di lavoro: puoi digitare un comando come git status , e git ti dirà quali file nella tua directory di lavoro sono stati aggiunti all’indice git (ad esempio, usando il comando git add filename ).

  • L’indice non è il repository git: i file nell’indice git sono file che git si impegna nel repository git se si è utilizzato il comando git commit.