Drzewo jest hierarchiczny zbiór plików i katalogów, nie związane z żadnym konkretnym momencie historii. Na przykład, jeśli utworzysz plik, a następnie usuniesz plik (bez żadnych innych pośrednich zatwierdzeń), skończysz z tym samym drzewem, z którym zacząłeś.
Popełnić jest punktem w historii projektu. Zatwierdzenie określa drzewo, ale zawiera także inne informacje, takie jak autor / zatwierdzający i czas, komunikat zatwierdzenia (w którym autor opisuje zmiany) oraz, co najważniejsze, zero lub więcej rodziców, które są poprzednim stanem repozytorium. (Twoje pierwsze zatwierdzenie ma zero rodziców. Większość zatwierdzeń ma potem jednego rodzica podczas liniowego rozwoju i więcej niż jednego, jeśli się scalisz.)
Możesz dowiedzieć się, jak to działa za pomocą git cat-file -p
polecenia, które drukuje zawartość określonego skrótu, niezależnie od typu. Na przykład, aby zobaczyć zatwierdzenie HEAD, możesz uruchomić:
$ 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
Aby zobaczyć drzewo wewnątrz tego zatwierdzenia, możesz cat-file -p
to drzewo:
$ git cat-file -p 81ca1cb660ea79131336944df28b13b711d93557
100644 blob 730f77a3be502cfe6769c1305c0b59c22274caf5 .gitignore
100644 blob bcbd000f6b9ad5b0510f804ac4a3b19306b39c03 .travis.yml
100644 blob da71aa1fa3c3ae47b2fe5e6245ce2eea1586e278 CONTRIBUTING.md
...
Podobnie, jeśli spojrzysz na rodziców, zobaczysz, że są to również zobowiązania. Skrót dla drzewa wewnątrz zatwierdzenia takiego jak rev
jest rev^{tree}
. Tak więc poprzednie polecenie mogło zostać zapisane git cat-file -p HEAD^{tree}
. Zauważ, że rev^
oznacza element nadrzędny dla rev
. Gdy istnieje wiele rodzice rev^1
, rev^2
itp Więcej informacji dostępnych jest na stronie man rev-parse git .
commit has
oznacza na początku trzeciego akapitu?