La risposta breve (TL; DR)
Ecco un elenco completo di identificatori di commit e tree-ish (dalla documentazione delle revisioni di Git ):
----------------------------------------------------------------------
| Commit-ish/Tree-ish | Examples
----------------------------------------------------------------------
| 1. <sha1> | dae86e1950b1277e545cee180551750029cfe735
| 2. <describeOutput> | v1.7.4.2-679-g3bee7fb
| 3. <refname> | master, heads/master, refs/heads/master
| 4. <refname>@{<date>} | master@{yesterday}, HEAD@{5 minutes ago}
| 5. <refname>@{<n>} | master@{1}
| 6. @{<n>} | @{1}
| 7. @{-<n>} | @{-1}
| 8. <refname>@{upstream} | master@{upstream}, @{u}
| 9. <rev>^ | HEAD^, v1.5.1^0
| 10. <rev>~<n> | master~3
| 11. <rev>^{<type>} | v0.99.8^{commit}
| 12. <rev>^{} | v0.99.8^{}
| 13. <rev>^{/<text>} | HEAD^{/fix nasty bug}
| 14. :/<text> | :/fix nasty bug
----------------------------------------------------------------------
| Tree-ish only | Examples
----------------------------------------------------------------------
| 15. <rev>:<path> | HEAD:README.txt, master:sub-directory/
----------------------------------------------------------------------
| Tree-ish? | Examples
----------------------------------------------------------------------
| 16. :<n>:<path> | :0:README, :README
----------------------------------------------------------------------
Gli identificatori # 1-14 sono tutti "commit-ish", perché tutti portano a commit, ma poiché i commit puntano anche ad alberi di directory, alla fine portano tutti a oggetti (sotto) albero di directory, e possono quindi essere usati anche come "albero -ish".
# 15 può anche essere usato come tree-ish quando fa riferimento a una (sotto) directory, ma può anche essere usato per identificare file specifici. Quando si riferisce ai file, non sono sicuro che sia ancora considerato "tree-ish", o se agisce più come "blob-ish" (Git si riferisce ai file come "blob").
La lunga risposta
Commit e alberi di directory in Git
Ai suoi livelli più bassi, Git tiene traccia del codice sorgente utilizzando quattro oggetti fondamentali:
- Tag annotati, che puntano ai commit.
- Commits, che puntano all'albero della directory principale del progetto.
- Alberi, che sono directory e sottodirectory.
- Blob, che sono file.
Ciascuno di questi oggetti ha il proprio hash ID sha1, poiché Linus Torvalds ha progettato Git come un filesystem indirizzabile al contenuto , ovvero i file possono essere recuperati in base al loro contenuto (gli ID sha1 sono generati dal contenuto del file). Il libro Pro Git fornisce questo diagramma di esempio :
Commit-ish vs Tree-ish
Molti comandi Git possono accettare identificatori speciali per commit e (sotto) alberi di directory:
"Commit-ish" sono identificatori che alla fine portano a un oggetto di commit. Per esempio,
tag -> commit
"Tree-ish" sono identificatori che alla fine portano a oggetti ad albero (cioè directory).
tag -> commit -> project-root-directory
Poiché gli oggetti commit puntano sempre a un oggetto albero di directory (la directory principale del progetto), qualsiasi identificatore "commit-ish" è, per definizione, anche "tree-ish". In altre parole, qualsiasi identificatore che porta a un oggetto commit può essere utilizzato anche per portare a un (sotto) oggetto albero di directory .
Ma poiché gli oggetti dell'albero di directory non puntano mai a commit nel sistema di controllo delle versioni di Git, non tutti gli identificatori che puntano a un (sotto) albero di directory possono anche essere usati per puntare a un commit. In altre parole, l'insieme di identificatori "commit-ish" è un sottoinsieme rigoroso dell'insieme di identificatori "tree-ish".
L'insieme di identificatori ad albero che non possono essere usati come commit-ish sono
<rev>:<path>
, che porta direttamente agli alberi di directory, non agli oggetti di commit. Ad esempio HEAD:subdirectory
,.
Identificatori Sha1 degli oggetti dell'albero di directory .
stash@{0}
. Mi piacerebbe sapere dove si inserisce tutto questo. Ci sono altre cose come stash (my-thing@{0}
)? La scorta è solo una<refname>
?