A resposta curta (TL; DR)
Aqui está uma lista completa de identificadores commit-ish e tree-ish (da documentação de revisões do 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
----------------------------------------------------------------------
Os identificadores # 1-14 são todos "commit-ish", porque todos eles levam a commits, mas porque os commits também apontam para árvores de diretórios, todos eles levam a objetos da árvore de (sub) diretórios e, portanto, também podem ser usados como "árvore -ish ".
# 15 também pode ser usado como uma árvore quando se refere a um (sub) diretório, mas também pode ser usado para identificar arquivos específicos. Quando se refere a arquivos, não tenho certeza se ainda é considerado "arvore" ou se age mais como "blob-ish" (Git se refere a arquivos como "blobs").
A resposta longa
Commits e árvores de diretório no Git
Em seus níveis mais baixos, o Git acompanha o código-fonte usando quatro objetos fundamentais:
- Tags anotadas, que apontam para commits.
- Commits, que apontam para a árvore do diretório raiz do seu projeto.
- Árvores, que são diretórios e subdiretórios.
- Blobs, que são arquivos.
Cada um desses objetos tem seu próprio sha1 hash ID, já que Linus Torvalds projetou o Git como um sistema de arquivos endereçável por conteúdo , ou seja, os arquivos podem ser recuperados com base em seu conteúdo (sha1 IDs são gerados a partir do conteúdo do arquivo). O livro Pro Git fornece este diagrama de exemplo :

Commit-ish vs Tree-ish
Muitos comandos Git podem aceitar identificadores especiais para commits e árvores de (sub) diretórios:
"Commit-ish" são identificadores que, em última análise, levam a um objeto de confirmação. Por exemplo,
tag -> commit
"Tree-ish" são identificadores que levam a objetos de árvore (isto é, diretório).
tag -> commit -> project-root-directory
Como os objetos de commit sempre apontam para um objeto de árvore de diretório (o diretório raiz de seu projeto), qualquer identificador que seja "commit-ish" é, por definição, também "tree-ish". Em outras palavras, qualquer identificador que leva a um objeto de confirmação também pode ser usado para conduzir a um objeto de árvore de (sub) diretório .
Mas, uma vez que os objetos da árvore de diretório nunca apontam para commits no sistema de versionamento do Git, nem todo identificador que aponta para uma árvore de (sub) diretório também pode ser usado para apontar para um commit. Em outras palavras, o conjunto de identificadores "commit-ish" é um subconjunto estrito do conjunto de identificadores "tree-ish".
O conjunto de identificadores ish de árvore que não podem ser usados como commit-ish são
<rev>:<path>, que leva diretamente a árvores de diretório, não a objetos de commit. Por exemplo HEAD:subdirectory,.
Identificadores Sha1 de objetos de árvore de diretório .
stash@{0}. Eu gostaria de saber onde isso se encaixa em tudo isso. Existem outras coisas como o stash (my-thing@{0})? O estoque é apenas um<refname>?