Jaka jest różnica między `Commit hash`,` Parent Hash` i `Tree hash` in git?

12

Dzisiaj uczę się podstawowej wiedzy na temat git, czytając ten dokument online:

http://git-scm.com/book/en/v2/Git-Basics-Viewing-the-Commit-Hi

W tym rozdziale zacząłem uczyć git log --pretty=format:" "się, jak wyświetlać informacje z dziennika według własnego gustu.

Ale w pewnym sensie widziałem w tabeli formatów dwie podobne opcje %Hdla Commit Hash, %Pdla Parent Hashi %Tdla Tree Hash.

Eksperymentowałem je w linii poleceń, okazuje się, że wszystkie są wartościami skrótu o tej samej długości i różnej wartości.

Poszukałem go i przepełniałem stosy, jak dotąd brak wyraźnych wskazówek.

Mam pojęcie na ten temat Hash value, jest to suma kontrolna tego polecenia git.

Ale co robi Parent Hashi Tree hashrobi?

  • PS: Ach, mam teraz kilka pomysłów, czy to Parent Hashoznaczało wartość skrótu bezpośredniego pochodzenia oddziału?
Zen
źródło

Odpowiedzi:

7

Skróty nadrzędne:

$ git log --graph
*   commit c06c4c912dbd9ee377d14ec8ebe2847cf1a3ec7e
|\  Merge: 79e6924 3113760
| | Author: linjie <[email protected]>
| | Date:   Mon Mar 14 16:02:09 2016 +0800
| |
| |     commit5
| |
| |     Merge branch 'dev'
| |
| * commit 31137606f85d8960fa1640d0881682a081ffa9d0
| | Author: linjie <[email protected]>
| | Date:   Mon Mar 14 16:01:26 2016 +0800
| |
| |     commit3
| |
* | commit 79e69240ccd218d49d78a72f33002fd6bc62f407
|/  Author: linjie <[email protected]>
|   Date:   Mon Mar 14 16:01:59 2016 +0800
|
|       commit4
|
* commit 7fd4e3fdddb89858d925a89767ec62985ba07f3d
| Author: linjie <[email protected]>
| Date:   Mon Mar 14 16:01:00 2016 +0800
|
|     commit2
|
* commit 316dd3fb3c7b501bc9974676adcf558a18508dd4
  Author: linjie <[email protected]>
  Date:   Mon Mar 14 16:00:34 2016 +0800

     commit1

$ git log --pretty=format:'%<(82)%P %s'
79e69240ccd218d49d78a72f33002fd6bc62f407 31137606f85d8960fa1640d0881682a081ffa9d0  commit5
7fd4e3fdddb89858d925a89767ec62985ba07f3d                                           commit4
7fd4e3fdddb89858d925a89767ec62985ba07f3d                                           commit3
316dd3fb3c7b501bc9974676adcf558a18508dd4                                           commit2
                                                                                   commit1

Możesz zobaczyć, że commit4 i commit3 jest rodzicem commit5 , commit2 jest rodzicem commit3 i commit4 , commit1 jest rodzicem commit2 .

Skrót drzewa:

$ git log --pretty=format:'%T %s'
f3c7cee96f33938631a9b023ccf5d8743b00db0e commit5
e0ecb42ae45ddc91c947289f928ea5085c70b208 commit4
d466aea17dc07516c449c58a73b2dc3faa9d11a1 commit3
b39f2e707050e0c5bbb3b48680f416ef05b179ba commit2
5706ec2b32605e27fa04cbef37d582325d14dda9 commit1

$ git cat-file -p f3c7ce
100644 blob 8bb2e871e94c486a867f5cfcbc6f30d004f6a9e5    dev
100644 blob 47f16c8e00adba77ec5c176876e99c8e9f05d69b    master

$ git cat-file -p 5706ec
100644 blob fc0bfde0d44bb4d6c7d27b6e587ebedd34ba5911    master

Funkcja polecenia: Ładnie wydrukuj zawartość na <object>podstawie jej typu.

git cat-file -p 

W git cała zawartość jest przechowywana jako obiekty drzewa i obiektów blob, z drzewami odpowiadającymi pozycjom katalogu UNIX i obiektom blob odpowiadającym mniej więcej inodom lub zawartości pliku. Pojedynczy obiekt drzewa zawiera jeden lub więcej wpisów drzewa, z których każdy zawiera wskaźnik SHA-1 do obiektu blob lub poddrzewa z powiązanym trybem, typem i nazwą pliku. Git zwykle tworzy drzewo, przyjmując stan obszaru postoju lub indeksu i zapisując z niego serię obiektów drzewa. Obiekty zatwierdzania mają informacje o tym, kto zapisał obiekt drzewa, kiedy zapisał lub dlaczego zostały zapisane. To są podstawowe informacje, które przechowuje obiekt zatwierdzenia.

Wniosek:

Hash zatwierdzenia, Hash rodzica, Hash drzewa to SHA-1. Zatwierdź skrót i nadrzędny skrót jest identyczny, z wyjątkiem nadrzędnego skrótu z dzieckiem. Skrót drzewa reprezentuje obiekt drzewa. Skrót zatwierdzenia i skrót skrótu nadrzędnego reprezentują obiekt zatwierdzenia.

Odniesienie:

  1. Git Internals - Git Objects

  2. git-cat-file - Podaj informacje o zawartości lub typie i rozmiarze obiektów repozytorium

linjie
źródło
4

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 -ppolecenia, 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Ä <[email protected]> 1436468108 -0700
committer Mislav MarohniÄ <[email protected]> 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 -pto 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 revjest 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^2itp Więcej informacji dostępnych jest na stronie man rev-parse git .

użytkownik3188445
źródło
2

„Commit Hash” to skrót dla bieżącego zatwierdzenia. Zatwierdź wpis, z którym jest powiązany.

„Hash nadrzędny” jest skrótem dla dowolnej gałęzi nadrzędnej, z której pochodzi zatwierdzenie.

„Drzewo hash” to skrót bieżącego katalogu w zatwierdzeniu. Hash jest równy hashowi, który ma katalog, jeśli widziany z katalogu nadrzędnego za pomocą git ls-files --stage --abbrev.

Odniesienie:

Braiam
źródło
1
co commit hasoznacza na początku trzeciego akapitu?
Zen