Krótka odpowiedź (TL; DR)
„Drzewo” to termin odnoszący się do dowolnego identyfikatora (określonego w dokumentacji wersji Git ), który ostatecznie prowadzi do (pod) drzewa katalogów (Git określa katalogi jako „drzewa” i „obiekty drzew”).
W przypadku oryginalnego plakatu foo
jest to katalog , który chce określić. Prawidłowym sposobem określenia (pod) katalogu w Git jest użycie składni "drzewa" (punkt # 15 z dokumentacji wersji Git ):
<rev>:<path>
Np HEAD:README
, :README
,master:./README
Sufiks, :
po którym następuje ścieżka, określa obiekt blob lub drzewo w podanej ścieżce w obiekcie drzewa nazwanym przez część przed dwukropkiem.
Innymi słowy, master:foo
to poprawna składnia, a nie master/foo
.
Inne „Tree-ish” (Plus Commit-ish)
Oto pełna lista identyfikatorów zatwierdzeń i drzew (z dokumentacji wersji Git , dzięki LopSae za wskazanie ):
----------------------------------------------------------------------
| 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, :README, master:./README
----------------------------------------------------------------------
| Tree-ish? | Examples
----------------------------------------------------------------------
| 16. :<n>:<path> | :0:README, :README
----------------------------------------------------------------------
Identyfikatory # 1-14 są wszystkie „zatwierdzone”, ponieważ wszystkie prowadzą do zatwierdzeń, ale ponieważ zatwierdzenia wskazują również drzewa katalogów, wszystkie ostatecznie prowadzą do obiektów (pod) drzewa katalogów i dlatego mogą być również używane jako „drzewo -ish ”.
Numer 15 może być również używany jako drzewo, gdy odnosi się do (pod) katalogu, ale może być również używany do identyfikowania określonych plików. Kiedy odnosi się do plików, nie jestem pewien, czy nadal jest uważany za „drzewo-ish”, czy działa bardziej jak „blob-ish” (Git określa pliki jako „bloby”).
Długa odpowiedź
Na najniższych poziomach Git śledzi kod źródłowy przy użyciu czterech podstawowych obiektów:
- Tagi z adnotacjami, które wskazują na zatwierdzenia.
- Commits, które wskazują drzewo katalogów głównych projektu.
- Drzewa, które są katalogami i podkatalogami.
- Obiekty BLOB, które są plikami.
Każdy z tych obiektów ma swój własny identyfikator hash sha1, ponieważ Linus Torvalds zaprojektował Gita jako system plików z adresowaniem treści , tj. Pliki mogą być pobierane na podstawie ich zawartości (identyfikatory sha1 są generowane z zawartości pliku). Książka Pro Git zawiera przykładowy diagram :
Wiele poleceń Git może akceptować specjalne identyfikatory dla zatwierdzeń i (pod) drzew katalogów:
„Commit-ish” to identyfikatory, które ostatecznie prowadzą do obiektu zatwierdzenia. Na przykład,
tag -> commit
„Drzewo” to identyfikatory, które ostatecznie prowadzą do obiektów drzewiastych (tj. Katalogów).
tag -> commit -> project-root-directory
Ponieważ obiekty zatwierdzone zawsze wskazują na obiekt drzewa katalogów (katalog główny projektu), każdy identyfikator, który jest „zatwierdzony”, jest z definicji również „drzewem”. Innymi słowy, każdy identyfikator prowadzący do obiektu zatwierdzenia może być również użyty do wskazania obiektu drzewa (pod) katalogu .
Ale ponieważ obiekty drzewa katalogów nigdy nie wskazują zatwierdzeń w systemie kontroli wersji Gita, nie każdy identyfikator wskazujący na (pod) drzewo katalogów może być również użyty do wskazania zatwierdzenia. Innymi słowy, zestaw identyfikatorów „zatwierdzonych” jest ścisłym podzbiorem zbioru identyfikatorów „drzewiastych”.
Jak wyjaśniono w dokumentacji ( dzięki Treborowi za pomoc w znalezieniu ):
<tree>
Wskazuje nazwę obiektu drzewa.
<commit>
Wskazuje nazwę obiektu zatwierdzenia.
<tree-ish>
Wskazuje nazwę obiektu drzewa, zatwierdzenia lub znacznika. Polecenie, które <tree-ish>
ostatecznie pobiera argument, chce operować na <tree>
obiekcie, ale automatycznie wyłuskuje <commit>
i <tag>
obiekty, które wskazują na a <tree>
.
<commit-ish>
Wskazuje nazwę obiektu zatwierdzenia lub znacznika. Polecenie, które <commit-ish>
ostatecznie pobiera argument, chce operować na <commit>
obiekcie, ale automatycznie wyłuskuje <tag>
obiekty, które wskazują na a <commit>
.
Zestaw drzew-owski identyfikatorów, które nie mogą być stosowane jako popełnić-owski są
<rev>:<path>
, co prowadzi bezpośrednio do drzew katalogów, a nie do zatwierdzania obiektów. Na przykład HEAD:subdirectory
.
Identyfikatory Sha1 obiektów drzewa katalogów .
master:foo
jest drzewiaste, ale lepiej użyjmaster foo
jako i<tree-ish> <path>
.