Was ist der Unterschied zwischen "Commit Hash", "Parent Hash" und "Tree Hash" in Git?

12

Heute lerne ich einige grundlegende Git-Kenntnisse, indem ich dieses Dokument online lese:

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

Und in diesem Kapitel lerne ich, wie man git log --pretty=format:" "Protokollinformationen nach meinem Geschmack anzeigt.

Aber wie, ich sah in der Formattabelle zwei ähnliche Optionen, %Hfür Commit Hash, %Pfür Parent Hashund %Tfür Tree Hash.

Ich habe sie in meiner Befehlszeile experimentiert. Es stellt sich heraus, dass es sich bei allen um Hash-Werte gleicher Länge mit unterschiedlichem Wert handelt.

Ich googelte und stapelte über, bisher keine offensichtlichen Hinweise.

Ich habe eine Idee davon Hash value, es ist eine Prüfsumme dieses Git-Commits.

Aber was macht Parent Hashund Tree hashmacht?

  • PS: Ah, ich habe jetzt einige Ideen. Bedeutete das Parent Hashden Hash-Wert des direkten Ursprungs eines Zweigs?
Zen
quelle

Antworten:

7

Eltern-Hashes:

$ 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

Sie können sehen, dass commit4 und commit3 das übergeordnete Element von commit5 ist , commit2 das übergeordnete Element von commit3 und commit4 ist , commit1 das übergeordnete Element von commit2 ist .

Baumhasch:

$ 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

Die Funktion des Befehls: Drucken Sie den Inhalt von <object>basierend auf seinem Typ hübsch aus .

git cat-file -p 

In git wird der gesamte Inhalt als Baum- und Blob-Objekt gespeichert, wobei Bäume UNIX-Verzeichniseinträgen und Blobs mehr oder weniger Inodes oder Dateiinhalten entsprechen. Ein einzelnes Baumobjekt enthält einen oder mehrere Baumeinträge, von denen jeder einen SHA-1-Zeiger auf einen Blob oder Teilbaum mit dem zugehörigen Modus, Typ und Dateinamen enthält. Git erstellt normalerweise einen Baum, indem es den Status Ihres Staging-Bereichs oder -Index übernimmt und eine Reihe von Baumobjekten daraus schreibt. Commit-Objekte enthalten Informationen darüber, wer das Baumobjekt gespeichert hat, wann sie gespeichert wurden oder warum sie gespeichert wurden. Dies sind die grundlegenden Informationen, die das Festschreibungsobjekt für Sie speichert.

Fazit:

Commit-Hash, Parent-Hash und Tree-Hash sind alle SHA-1. Commit-Hash und Parent-Hash sind identisch, außer Parent-Hash hat Child. Baum-Hash ist ein Baumobjekt. Commit-Hash und Parent-Hash repräsentieren ein Commit-Objekt.

Referenz:

  1. Git Internals - Git-Objekte

  2. git-cat-file - Geben Sie Informationen zu Inhalt oder Typ und Größe für Repository-Objekte an

linjie
quelle
4

Ein Baum ist eine hierarchische Sammlung von Dateien und Verzeichnissen, die nicht an einen bestimmten Punkt im Verlauf gebunden sind. Wenn Sie beispielsweise eine Datei erstellen und diese später löschen (ohne weitere Zwischenschritte), erhalten Sie denselben Baum, mit dem Sie begonnen haben.

Ein Commit ist ein Punkt in der Geschichte Ihres Projekts. Ein Commit gibt einen Baum an, enthält aber auch andere Informationen wie Autor / Committer und Zeit, eine Commit-Nachricht (in der der Autor beschreibt, was sich geändert hat) und vor allem null oder mehr Eltern, die den vorherigen Status des Repositorys darstellen. (Ihr allererster Commit hat keine Eltern. Die meisten Commits danach haben einen Elternteil während der linearen Entwicklung und mehr als einen, wenn Sie zusammenführen.)

Sie können sich ein Bild davon machen, wie dies mit dem git cat-file -pBefehl funktioniert , der den Inhalt eines bestimmten Hashs unabhängig vom Typ druckt. Um beispielsweise das HEAD-Commit anzuzeigen, können Sie Folgendes ausführen:

$ 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

Um den Baum in diesem Commit zu sehen, können Sie cat-file -pihn als Baum verwenden:

$ git cat-file -p 81ca1cb660ea79131336944df28b13b711d93557
100644 blob 730f77a3be502cfe6769c1305c0b59c22274caf5        .gitignore
100644 blob bcbd000f6b9ad5b0510f804ac4a3b19306b39c03        .travis.yml
100644 blob da71aa1fa3c3ae47b2fe5e6245ce2eea1586e278        CONTRIBUTING.md
...

Wenn Sie sich die Eltern ansehen, werden Sie auch feststellen, dass es sich um Commits handelt. Eine Abkürzung für den Baum innerhalb eines Commits wie es revist rev^{tree}. Der vorherige Befehl hätte also geschrieben werden können git cat-file -p HEAD^{tree}. Beachten Sie, dass dies rev^für das übergeordnete Element von steht rev. Wenn es mehrere Eltern sind rev^1, rev^2usw. Weitere Informationen finden Sie in der zur Verfügung stehenden git rev-Parse - man - Seite .

user3188445
quelle
2

"Commit Hash" ist der Hash für das aktuelle Commit. Das Commit, mit dem der Eintrag verknüpft ist.

"Parent Hash" ist der Hash für alle übergeordneten Zweige, aus denen das Commit stammt.

"Tree Hash" ist der Hash des aktuellen Verzeichnisses im Commit. Der Hash ist gleich dem Hash, den das Verzeichnis hat, wenn es vom übergeordneten Verzeichnis mit gesehen wird git ls-files --stage --abbrev.

Referenz:

Braiam
quelle
1
Was commit hasbedeutet am Anfang Ihres 3. Absatzes?
Zen