Co to jest zatwierdzanie i drzewo w Git?

117

Pytanie

Jakie są konkretne przykłady zatwierdzania i tworzenia drzew w Git?

Pytanie dotyczące przepełnienia stosu „Co oznacza drzewko w git?” dotyczy konkretnie drzew, ale chcę dowiedzieć się więcej o obu .

tło

Zastosowania w dokumentacji

Dokumentacja Gita zawiera kilka odniesień do „commit-ish” i „tree-ish”. Na przykład, jeśli badasz kod źródłowy Git :

$ git grep --files-with-matches --extended-regexp "commit(-)*ish"
config.txt
git-describe.txt
git-fast-import.txt
git-name-rev.txt
git-push.txt
git-rebase.txt
git-rev-parse.txt
git.txt
gitcli.txt
glossary-content.txt
howto/revert-branch-rebase.txt
revisions.txt

i

$ git grep --files-with-matches --extended-regexp "tree(-)*ish" | \
$ grep --invert-match RelNotes
diff-format.txt
diff-generate-patch.txt
git-archive.txt
git-cat-file.txt
git-checkout.txt
git-diff-index.txt
git-diff-tree.txt
git-ls-files.txt
git-ls-tree.txt
git-merge-tree.txt
git-read-tree.txt
git-reset.txt
git-svn.txt
git.txt
gitcli.txt
gittutorial-2.txt
glossary-content.txt
revisions.txt

Definicje

Dokumentacja Gita definiuje, czym są „commit-ish” i „tree-ish” :

<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>.

Dokumentacja nie jest wystarczająco jasna

Mimo że powyższa dokumentacja definiuje, czym są „zatwierdzenie” i „drzewo”, nadal uważam, że jest to zbyt niejasne i niejasne.

Jakie są konkretne przykłady „zatwierdzania” i „drzewa” i czym się one od siebie różnią?

Społeczność
źródło

Odpowiedzi:

156

Krótka odpowiedź (TL; DR)

Oto pełna lista identyfikatorów zatwierdzeń i drzew (z dokumentacji wersji 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
----------------------------------------------------------------------

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 ”.

# 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ź

Zatwierdzenia i drzewa katalogów w Git

Na najniższych poziomach Git śledzi kod źródłowy przy użyciu czterech podstawowych obiektów:

  1. Tagi z adnotacjami, które wskazują na zatwierdzenia.
  2. Commits, które wskazują drzewo katalogów głównych projektu.
  3. Drzewa, które są katalogami i podkatalogami.
  4. 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 :

Rysunek 9-3 z książki Pro Git

Commit-ish vs Tree-ish

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 twojego 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ą na zatwierdzenia 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”.

Zestaw drzew-owski identyfikatorów, które nie mogą być stosowane jako popełnić-owski

  1. <rev>:<path>, co prowadzi bezpośrednio do drzew katalogów, a nie do zatwierdzania obiektów. Na przykład HEAD:subdirectory.

  2. Identyfikatory Sha1 obiektów drzewa katalogów .


źródło
3
Nie zapomnij o stash@{0}. Chciałbym wiedzieć, gdzie to wszystko pasuje. Czy są jakieś inne rzeczy, takie jak stash ( my-thing@{0})? Czy skrytka to tylko <refname>?
Nate
Nie zostało jasno określone, że identyfikator drzewa wydaje się być bardziej szczegółowym identyfikatorem niż identyfikator zatwierdzenia. Może jestem dziwny, ale to jedyny rozsądny sposób, aby to wyjaśnić. IMO
Steven Lu
29

Uwaga dla osób posługujących się językiem obcym w języku angielskim [sic!]: „-Ish” to przyrostek, który można zastosować do przymiotnika w celu wskazania „posiadający cechy takie jak” lub „nieznacznie” - patrz http://chambers.co.uk / search /? query = ish & title = 21st

Stąd „drzewo” - jak „drzewo” .... „zatwierdzenie” - jak „zatwierdzenie”

np. „Mars wygląda jak czerwonawa gwiazda” („d” jest podwojone!); „jedzenie na talerzu nie było gorące, ale ciepłe”

Uważam, że pomaga to lepiej wyjaśnić „co jest…”, ponieważ wyjaśnia użycie języka.

MikeW
źródło
Zawsze interpretowałem „drzewo” i „zatwierdzenie” jako odpowiednik określenia „szwedzki” lub „angielski”. Użycie, które opisujesz, jest dla mnie mniej sensowne, ponieważ ta forma „ish” tworzy przymiotnik. Ale rev nie jest "jak" drzewo lub zatwierdzenie, to jest drzewo lub zatwierdzenie. Z drugiej strony, jeśli myślisz o „ish” jako o sufiksie języka, mają one większy sens jako rzeczowniki w wierszu poleceń, gdzie „drzewo-ish” jest językiem tworzącym rzeczownik. Nie wiem, jaka interpretacja była zamiarem autorów, ale zawsze tak to widziałem.
jmt
Rozumiem twój punkt widzenia, ale tylko sprawiałem wrażenie, jakie mam, jako native speakera języka angielskiego!
MikeW