Un albero è una raccolta gerarchica di file e directory, non legata a nessun punto particolare della storia. Ad esempio, se crei un file e successivamente lo elimini (senza altri commit intermedi), finirai con lo stesso albero con cui hai iniziato.
Un commit è un punto nella storia del tuo progetto. Un commit specifica un albero, ma contiene anche altre informazioni come autore / committer e tempo, un messaggio di commit (in cui l'autore descrive cosa è cambiato) e, soprattutto, zero o più genitori, che sono lo stato precedente del repository. (Il tuo primo commit ha zero genitori. La maggior parte dei commit dopo ha un genitore durante lo sviluppo lineare e più di uno se ti unisci).
Puoi avere un'idea di come funziona con il git cat-file -p
comando, che stampa il contenuto di un determinato hash, indipendentemente dal tipo. Ad esempio, per esaminare il commit HEAD, è possibile eseguire:
$ git cat-file -p HEAD
tree 81ca1cb660ea79131336944df28b13b711d93557
parent 92b6b8fe9956866ace5397e060e7cc8ee1c76233
parent 7ea2575ed96d150ee19f70edea4bd42c7c2f0b83
author Mislav MarohniÄ <mislav.marohnic@gmail.com> 1436468108 -0700
committer Mislav MarohniÄ <mislav.marohnic@gmail.com> 1436468108 -0700
Merge pull request #951 from github/global-args
Avoid depending on a hardcoded list of git global flags
Per vedere l'albero all'interno di quel commit, è possibile cat-file -p
che sia albero:
$ git cat-file -p 81ca1cb660ea79131336944df28b13b711d93557
100644 blob 730f77a3be502cfe6769c1305c0b59c22274caf5 .gitignore
100644 blob bcbd000f6b9ad5b0510f804ac4a3b19306b39c03 .travis.yml
100644 blob da71aa1fa3c3ae47b2fe5e6245ce2eea1586e278 CONTRIBUTING.md
...
Allo stesso modo, se guardi i genitori, vedrai che anche questi sono impegni. Una scorciatoia per l'albero all'interno di un commit come rev
è rev^{tree}
. Quindi il comando precedente avrebbe potuto essere scritto git cat-file -p HEAD^{tree}
. Nota che rev^
sta per il genitore di rev
. Quando ci sono più i genitori, rev^1
, rev^2
, ecc Maggiori informazioni sono disponibili nella pagina man rev-parse git .
commit has
significa all'inizio del tuo terzo paragrafo?